如何将构造函数表达式放入数组并在c#中使用它们

本文关键字:数组 构造函数 表达式 | 更新日期: 2023-09-27 18:07:55

假设类XY都继承自类P假设我们有A和B的构造函数表达式数组(不确定是什么代码),因此(psudo代码)

a[0] = new X();
a[1] = new Y();

如何得到:P p = Execute(a[0]);

如何将构造函数表达式放入数组并在c#中使用它们

您可以创建一个Func<P> s数组,如下所示:

var a = new Func<P>[2];
a[0] = () => new X();
a[1] = () => new Y();
var p = a[0]();

这里假定构造函数方法是无参数的。

您可以为构造函数创建一个Func<P>委托数组。例如:

Func<P>[] a = new Func<P>[2];
a[0] = () => new X();
a[1] = () => new Y();
P p = a[0]();

上面的例子涵盖了默认构造函数调用。更复杂的构造函数调用可以通过创建一个对象来保存构造函数值,然后更改数组以接受该对象来实现。例如,假设有一个类Z,它的属性是val1和val2。可以这样做:

Func<Z, P>[] a = new Func<Z, P>[2];
a[0] = z => new X(z.val1, z.val2);
a[1] = z => new Y();
Z varZ = new Z(1, 2); // For example
P p = a[0](varZ);
P p1 = a[1](null);

使用反射:

var types =
        Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(typ => typ.BaseType == typeof(P))
            .OrderBy(typ=>typ.Name)
            .Select(typ => typ.GetConstructors().First()).ToArray();
    var a = (P)types[0].Invoke(null);
    var y = (P)types[3].Invoke(null);
    var x = (P)types[2].Invoke(null);
    var b = (P)types[1].Invoke(null);

这将为p的每个子类创建一个充满ConstructorInfo的数组。

如果你想自定义添加每个ConstructorInfo:

 var type = Assembly.GetExecutingAssembly().GetType("typeName").GetConstructors().First();

这是在构造函数为空且为public的情况下。