在C#中有参数约束的通用构造函数吗?
在C#中,您可以对generics方法施加约束:
public class A { public static void Method<T> (T a) where T : new() { //...do something... } }
你指定T
应该有一个不需要参数的构造函数。 我想知道是否有一种方法来添加一个约束,如“ 存在一个float[,]
参数的构造函数?
下面的代码不能编译:
public class A { public static void Method<T> (T a) where T : new(float[,] u) { //...do something... } }
解决方法也是有用的?
正如你所发现的,你不能这样做。
作为解决方法,我通常会提供一个可以创buildtypes为T
对象的委托:
public class A { public static void Method<T> (T a, Func<float[,], T> creator) { //...do something... } }
没有这样的构造。 您只能指定一个空的构造函数约束。
我用lambda方法解决了这个问题。
public static void Method<T>(Func<int,T> del) { var t = del(42); }
用例
Method(x => new Foo(x));
使用reflection来创build一个通用对象,该types仍然需要声明正确的构造函数,否则将引发exception。 只要符合其中一个构造函数,就可以传入任何参数。
使用这种方式,您不能在模板中的构造函数上施加约束。 如果构造函数丢失,则需要在运行时处理exception,而不是在编译时得到错误。
// public static object CreateInstance(Type type, params object[] args); // Example 1 T t = (T)Activator.CreateInstance(typeof(T)); // Example 2 T t = (T)Activator.CreateInstance(typeof(T), arg0, arg1, arg2, ...); // Example 3 T t = (T)Activator.CreateInstance(typeof(T), (string)arg0, (int)arg1, (bool)arg2);
这是我个人觉得非常有效的解决方法。 如果你想到通用的参数化构造函数约束是什么,它实际上是具有特定签名的types和构造函数之间的映射。 您可以使用字典创build自己的这种映射。 把这些放在一个静态的“工厂”类,你可以创build不同types的对象,而不必担心每次构build一个构造函数lambda:
public static class BaseTypeFactory { private delegate BaseType BaseTypeConstructor(int pParam1, int pParam2); private static readonly Dictionary<Type, BaseTypeConstructor> mTypeConstructors = new Dictionary<Type, BaseTypeConstructor> { { typeof(Object1), (pParam1, pParam2) => new Object1(pParam1, pParam2) }, { typeof(Object2), (pParam1, pParam2) => new Object2(pParam1, pParam2) }, { typeof(Object3), (pParam1, pParam2) => new Object3(pParam1, pParam2) } };
那么在你的generics方法中,例如:
public static T BuildBaseType<T>(...) where T : BaseType { ... T myObject = (T)mTypeConstructors[typeof(T)](value1, value2); ... return myObject; }
不。目前,唯一可以指定的构造函数约束是针对无参数构造函数的。