Mer*_*ovi 17 .net c# generics type-constraints
有没有办法创建一个使用new()
构造函数约束来要求具有特定类型构造函数的类的泛型方法?
例如:
我有以下代码:
public T MyGenericMethod<T>(MyClass c) where T : class
{
if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null)
{
throw new ArgumentException("Invalid class supplied");
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
是否有可能有这样的东西?
public T MyGenericMethod<T>(MyClass c) where T : new(MyClass)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
the*_*oop 28
并不是的; C#仅支持no-args构造函数约束.
我用于通用arg构造函数的解决方法是将构造函数指定为委托:
public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) {
// ...
T newTObj = ctor(c);
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后在打电话时:
MyClass c = new MyClass();
MyGenericMethod<OtherClass>(c, co => new OtherClass(co));
Run Code Online (Sandbox Code Playgroud)
不幸的是,通用约束只允许你包括:
where T : new()
Run Code Online (Sandbox Code Playgroud)
其中指定了一个默认的无参数构造函数.没有办法约束到具有接受特定参数类型的构造函数的类型.
有关详细信息,请参阅类型参数的约束.