为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕尼黑8549860 2019-11-29 15:41:28
在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...    }}解决方法也有用吗?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

如您所知,您无法执行此操作。


作为一种解决方法,我通常提供一个可以创建以下类型的对象的委托T:


public class A {


    public static void Method<T> (T a, Func<float[,], T> creator) {

        //...do something...

    }


}


查看完整回答
反对 回复 2019-11-29
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这是我个人认为相当有效的解决方法。如果您想到什么是通用的参数化构造函数约束,它实际上是类型和具有特定签名的构造函数之间的映射。您可以使用字典来创建自己的映射。将它们放在静态的“ factory”类中,您可以创建各种类型的对象,而不必担心每次都要构造构造函数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) }

   };

然后在您的通用方法中,例如:


   public static T BuildBaseType<T>(...)

      where T : BaseType

   {

      ...

      T myObject = (T)mTypeConstructors[typeof(T)](value1, value2);

      ...

      return myObject;

   }


查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 929 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信