如何有条件地创建带有约束的obj

问题描述 投票:1回答:1

我有2个类,它们具有不同的约束,我想在泛型函数中有条件地为它们创建obj。下面的示例。

public class Foo1<T>
 where T : class, Interface1, new()
{
   // do sth...
}

public class Foo2<T>
 where T : class, Interface2, new()
{
   //do sth...
}

public static void Create<T>()
{
    if(typeof(Interface1).IsAssignableFrom(typeof(T))
   {
       var obj = new Foo1();
       //...
   } else if (typeof(Interface2).IsAssignableFrom(typeof(T))
   {
       var obj = new Foo1();
       //...
   }
}

并且我收到错误消息“没有从T到Interface1 / 2的隐式引用转换”。问题类似于How to conditionally invoke a generic method with constraints?的相似,但我可以找到添加(动态)的地方。

c# constraints
1个回答
1
投票

您可以使用反射创建泛型类的实例。

public static void Create<T>()
{
   if (typeof(Interface1).IsAssignableFrom(typeof(T)))
   {
        var d1 = typeof(Foo1<>);
        Type[] typeArgs = { typeof(T) };
        var makeme = d1.MakeGenericType(typeArgs);
        object o = Activator.CreateInstance(makeme);
    }
    else if (typeof(Interface2).IsAssignableFrom(typeof(T))
    {

        // same for Foo2
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.