sagar wasule Ответов: 1

Как использовать динамический объект с дженериками в C#


Привет,

У меня есть динамический объект, созданный. Мне нужно передать это как универсальный тип методу. Как бы я мог достичь того же ?

Пример :

Скажем, у меня есть динамический объект obj, я должен получить тип этого объекта и передать его методу, который ожидает generic.

Тип type = obj.метод GetType();

пример - класса в<Т> = Новый класса класса&ЛТ;п&ГТ;();

Что я уже пробовал:

Я попытался передать переменную типа, которая имеет тип динамического объекта obj, в ClassA< t>class = new ClassA< t> (); но это не работает.
Есть идеи, как справиться с этим сценарием ?

1 Ответов

Рейтинг:
5

Richard Deeming

Вы не сможете напрямую создать строго типизированный экземпляр класса, так как компилятор не имеет достаточно информации, чтобы знать, что такое закрытый универсальный тип.

Вы можете создать экземпляр типа с поздней привязкой с помощью отражения:

Type t = obj.GetType();
Type myType = typeof(ClassA<>).MakeGenericType(t);
object instance = Activator.CreateInstance(myType);

Или вы можете использовать отражение для вызова универсального метода для создания и использования экземпляра:
static class Helper
{
    private static readonly MethodInfo DoStuffMethod = typeof(Helper).GetMethod("DoStuffHelper", BindingFlags.NonPublic | BindingFlags.Static);
    
    private static void DoStuffHelper<T>(T value)
    {
        var instance = new ClassA<T>();
        ...
    }
    
    public static void DoStuff(object value)
    {
        if (value == null) throw new ArgumentNullException(nameof(value));
        
        Type t = value.GetType();
        MethodInfo m = DoStuffMethod.MakeGenericMethod(t);
        m.Invoke(null, new[] { value });
    }
}