猿问

C#中是否有带有参数约束的泛型构造函数?

在C#中,您可以对通用方法施加约束,例如:


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...

    }


}

解决方法也有用吗?


慕尼黑8549860
浏览 930回答 3
3回答

蝴蝶刀刀

如您所知,您无法执行此操作。作为一种解决方法,我通常提供一个可以创建以下类型的对象的委托T:public class A {&nbsp; &nbsp; public static void Method<T> (T a, Func<float[,], T> creator) {&nbsp; &nbsp; &nbsp; &nbsp; //...do something...&nbsp; &nbsp; }}

明月笑刀无情

这是我个人认为相当有效的解决方法。如果您想到什么是通用的参数化构造函数约束,它实际上是类型和具有特定签名的构造函数之间的映射。您可以使用字典来创建自己的映射。将它们放在静态的“ factory”类中,您可以创建各种类型的对象,而不必担心每次都要构造构造函数lambda的情况:public static class BaseTypeFactory{&nbsp; &nbsp;private delegate BaseType BaseTypeConstructor(int pParam1, int pParam2);&nbsp; &nbsp;private static readonly Dictionary<Type, BaseTypeConstructor>&nbsp; &nbsp;mTypeConstructors = new Dictionary<Type, BaseTypeConstructor>&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; { typeof(Object1), (pParam1, pParam2) => new Object1(pParam1, pParam2) },&nbsp; &nbsp; &nbsp; { typeof(Object2), (pParam1, pParam2) => new Object2(pParam1, pParam2) },&nbsp; &nbsp; &nbsp; { typeof(Object3), (pParam1, pParam2) => new Object3(pParam1, pParam2) }&nbsp; &nbsp;};然后在您的通用方法中,例如:&nbsp; &nbsp;public static T BuildBaseType<T>(...)&nbsp; &nbsp; &nbsp; where T : BaseType&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; T myObject = (T)mTypeConstructors[typeof(T)](value1, value2);&nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; return myObject;&nbsp; &nbsp;}
随时随地看视频慕课网APP
我要回答