D365F&O扩展类(二)

C#里的扩展类相对简单,可以看做是简单的语法糖。
X++里的扩展类就相对复杂很多,先从最简单的开始,在X++中实现上文在C#中实现的类和方法,代码如下所示:

public class Main
{
    static public void Main(Args _args)
    {
        info (new Person().Stage());
    }
}
public class Person
{
    public int Age;
}
[ExtensionOf(classStr(Person))]
final public class Person_Extension{    
    public str Stage()
    {                
        if (this.Age <= 18)
        {
            return "未成年";
        }
        else
        {
            return "成年";
        }
    }
}

类定义和调用的方法大同小异,主要是扩展类的定义。
跟C#不同
1.扩展类用的是实例类和实例方法。
2.类用final修饰,也就是说扩展类不能被继承。
3.当前这个扩展类扩展的是哪个类型,用ExtensionOf这个Attribute来指定,而不是像C#一样通过方法的第一个入参用this指定。
X++支持如下类型的扩展:
classstr,
tablestr,
dataentityviewstr,
mapstr,
viewstr
formstr
querystr
要是支持EDT类型的扩展就更好了,EDT类型现有的属性不够用,需要扩展,比如现在str类型的属性只有最大长度,有些情况下可能要限定用户输入必须要固定的位数,real类型的EDT有时候需要限定用户能输入的最大值和最小值,如果支持扩展针对某些EDT类型写一些扩展方法就方便多了。
X++的扩展类还有很多C#的扩展类没有的特性。
因为C#的扩展类是静态类,所以不能有实例方法,也不能扩展属性,而X++的扩展类是实例类,支持属性的扩展,也可以定义静态方法。

public class Main
{
    static public void Main(Args _args)
    {
        Person person = new Person();
        
        person.Height = 1.75;
        person.Weight = 70;

        info (num2Str(person.BMI(),0 ,2, 0, 0));
        Person::Introduce();
    }

}
[ExtensionOf(classStr(Person))]
final public class Person_Extension{    

    public real Height;
    public real Weight;

    public static str PersonInfo = "Hello,World!";
       
    public real BMI()
    {
        return Weight /(Height * Height);
    }
    public static void Introduce()
    {
        info (PersonInfo);
    }
}

等于X++的扩展类无所不能可以扩展一切了,直接把属性,方法,静态属性和静态方法都能随便加进去。
C#目前还不能扩展属性,当然它有自己的考虑,这样可以扩展一切的做法,有利有弊,仁者见仁智者见智的事情了,所以C#一直在讨论要不要加上扩展属性。
X++ 作为一种平台语言,可扩展性更加急迫,要不然没法玩,所以直接把扩展一步到位了。
知道了X++扩展类的使用方法,但是它底层具体是怎么实现的呢?
C#是通过静态类和静态方法,第一个入参是被扩展类实例的引用,通过编译器做一下转换,这个很好理解。
X++的扩展类是个实例类,它是怎么把被扩展类的实例传到扩展类的实例方法的呢?扩展类是什么时候实例化的呢?
这个留在下一篇摸索一下。

原文地址:https://www.cnblogs.com/Farseer1215/p/12772075.html