Создать экземпляр класса generi c из динамического типа c - PullRequest
3 голосов
/ 04 февраля 2020

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

Class GenericClass<T> {

}

Main()
{
    string inputtype = "classname, assemblyname";

    Type type = Type.GetType(inputtype);

    dynamic instance = Activator.CreateInstance(type);

    // Want to create a object of GenericClass<T> but I get compiletime errors.
    // Is it possible to do like below?

    GenericClass<instance> = new GenericClass<instance>();
}

Ответы [ 3 ]

7 голосов
/ 04 февраля 2020

Вы можете использовать отражение следующим образом:

object genericInstance = Activator.CreateInstance(typeof(GenericClass<>).MakeGenericType(type));

, но тогда вам придется использовать его, чтобы использовать его, чтобы оно не было безопасным для типов.

1 голос
/ 04 февраля 2020

Другие ответы на самом деле не отвечают на ваш вопрос:

Могу ли я сделать это: GenericClass<instance> = new GenericClass<instance>();?

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

Could Как ты мог, если это известно только во время выполнения? И если он не только известен во время выполнения, то вы не будете в этом беспорядке с самого начала; Вы должны отделить назначаемый тип во время компиляции (в вашем коде).

Generics, здесь красная сельдь. Ваша проблема заключается в том, что вы не знаете тип объекта при написании кода:

Type t = someMethodGivesMeATypeIDontKnowWhenWritingThisCode();

//I need to make an instance of this type.
//The only thing I know is that it needs to have a default contructor
//or it will crash
var o = Activator.CreateInstance(t);

Как вы думаете, какое время компиляции будет o? Это не может быть ничем иным, кроме object, потому что компилятор не знает и не может ничего знать о реальном типе объекта.

1 голос
/ 04 февраля 2020

Да, вы можете создавать экземпляр обобщенного типа c во время выполнения, зная ожидаемые параметры обобщенного типа (типов) c. Можете ли вы сделать что-нибудь полезное с этим? Это зависит.

Вот пример. Обратите внимание, что у меня есть интерфейс (не универсальный c), который дает мне поведение, которое я могу использовать:

public class Program
{
    public static void Main(string[] args)
    {

        var genericType = typeof(int); // You could have a string and Type.GetType here
        var genericClassType = typeof(GenericClass<>).MakeGenericType(genericType);
        var instance = (ICanTellYouMyType)Activator.CreateInstance(genericClassType);
        Console.WriteLine(instance.WhatsMyGenericType()); 
        // Output is "Int32"

    }
}

public interface ICanTellYouMyType
{
    string WhatsMyGenericType();
}

public class GenericClass<T> : ICanTellYouMyType
{
    public string WhatsMyGenericType()
    {
        return typeof(T).Name;
    }
}

Живой пример: https://rextester.com/XJHFM53278

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