如何将构造函数表达式放入数组并在c#中使用它们
本文关键字:数组 构造函数 表达式 | 更新日期: 2023-09-27 18:07:55
假设类X
和Y
都继承自类P
假设我们有A和B的构造函数表达式数组(不确定是什么代码),因此(psudo代码)
a[0] = new X();
a[1] = new Y();
如何得到:P p = Execute(a[0]);
您可以创建一个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的情况下。