gpt4 book ai didi

C#:具有继承类型构造函数的 Func

转载 作者:行者123 更新时间:2023-11-30 13:50:32 25 4
gpt4 key购买 nike

正如我们所知,您可以将构造函数指向 Func<T>像这样:

Func<MyObject> constructor = () => new MyObject();
var newObject = constructor();

但是有没有一种方法可以为您知道从 MyObject 继承的对象创建构造函数,但您不知道它的确切类型?

Type inheritedObjectType = obj; // Parameter
Func<MyObject> constructor = () => new MyObject(); // as inheritedObjectType
var newInheritedObject = constructor; // Should now be of the inherited type

使用 Activator 的答案或任何返回 Object不是一个选项。

编辑:我不知道编译时派生类型是什么类型。我只有一个 System.Type .

最佳答案

您可以使用表达式树来构建和编译将创建您的派生类型的委托(delegate):

Func<TBase> CreateDelegate<TBase>(Type derived)
{
var ctor = derived.GetConstructor(Type.EmptyTypes);

if (ctor == null)
{
throw new ArgumentException("D'oh! No default ctor.");
}

var newExpression = Expression.Lambda<Func<TBase>>(
Expression.New(ctor, new Expression[0]),
new ParameterExpression[0]);

return newExpression.Compile();
}

你可以简单地这样调用它:

Func<MyBase> create = CreateDelegate<MyBase>(typeof(Derived));

MyBase instance = create();

当您缓存该委托(delegate)时,您将获得最佳性能。

关于C#:具有继承类型构造函数的 Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6177232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com