Как создать универсальный класс принимает несколько типов C # - PullRequest
0 голосов
/ 11 октября 2019

У меня есть два класса:

LinkedEntityProvider<TObj, TRes> and HistValidator<TObj>.

Во втором вам нужно создать экземпляр первого.

PropertyInfo[] props = typeof(TObj).GetProperties();

foreach (PropertyInfo prop in props)
{
    var sourceAttrs = prop.GetCustomAttribute<Reference>();

    if (sourceAttrs != null)
    {
        Type entityType = sourceAttrs.ReferenceType;

        //Here i need to create LinkedEntityProvider<TObj, TRes> and use type entityType like TRes
    }
}

1 Ответ

1 голос
/ 11 октября 2019

Чтобы создать закрытый универсальный тип, вы можете сделать это:

var openGenericType = typeof(LinkedEntityProvider<,>);
var closedGenericType = openGenericType.MakeGenericType(typeof(TObj), entityType);
var instance = Activator.CreateInstance(closedGenericType);

Первая строка получает открытый тип, т.е. без универсальных параметров. Затем мы передаем параметры в MakeGenericType для получения чего-то похожего на typeof(LinkedEntityProvider<TObj, TRes>).

Получив это, мы можем создать экземпляр, используя Activator.CreateInstance. Если конструктор объекта принимает какие-либо параметры, вам придется передать их в Activator.CreateInstance, например:

var instance = Activator.CreateInstance(closedGenericType, new object[] { constructorParameter1, constructorParameter2 });

Обратите внимание, что, поскольку нет способа узнать тип, который создается во время компиляции,Activator.CreateInstance возвращает object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...