Как условно создать объект с ограничениями - PullRequest
1 голос
/ 03 апреля 2020

У меня есть 2 класса, которые имеют другое ограничение, и я хочу создать для них obj условно в обобщенной функции c. Пример ниже.

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". Проблема похожа на Similiar на Как условно вызвать метод generi c с ограничениями? , но я могу найти место для добавления (Dynami c).

1 Ответ

1 голос
/ 03 апреля 2020

Вы можете создать экземпляр обобщенного c класса, используя отражение.

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...