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

| 我们知道,您可以像这样将构造函数指向
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
的答案不是一个选择。 编辑:我不知道在编译时派生类型是什么类型。我只有五英镑。     
已邀请:
        您可以使用表达式树来构建和编译将创建派生类型的委托:
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();
缓存该委托时,将获得最佳性能。     
        该程序是否表现出所需的行为?
class MyObject{}
class Derived : MyObject {}
internal class Program
{

    public static void Main()
    {
        // the type you want to construct
        Type type = typeof (Derived);

        MethodInfo getConstructor = MakeConstructorGetter(type);
        Func<MyObject> constructor = (Func<MyObject>)getConstructor.Invoke(null, null);

        var obj = constructor();
        Console.WriteLine(obj.GetType());
    }

    private static MethodInfo MakeConstructorGetter(Type type)
    {
        MethodInfo mi = typeof(Program).GetMethod(\"GetObjectConstructor\", BindingFlags.Static | BindingFlags.NonPublic);
        var getConstructor = mi.MakeGenericMethod(type);
        return getConstructor;
    }

    private static Func<T> GetObjectConstructor<T>() where T : MyObject, new()
    {
        return () => new T();
    }
}
如果由“ 10”描述的类型与通用约束不匹配,则“ 9”将引发异常。因此,这将在执行时而不是在编译时失败,但是我想这是在动态处理泛型时需要做出的权衡。     

要回复问题请先登录注册