如何解决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”将引发异常。因此,这将在执行时而不是在编译时失败,但是我想这是在动态处理泛型时需要做出的权衡。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。