Создание нового экземпляра из n неизвестного типа - PullRequest
1 голос
/ 20 января 2009

Я хотел бы написать общий метод , который создает новые экземпляры указанного типа. Я пытался

protected T CreateNew<T>()
    where T : new()
{
    return new T();
}

Это работает, но только если я указал тип во время компиляции, как и

var x = CreateNew<Point>();

Дело в том, что мне нужно сделать что-то вроде этого

ISomeInterface inter;
if (selection == 1)
    inter = new SomeClass();
else
    inter = new SomeClass2();
// ...
ISomeInterface inter2 = CreateNew<typeof(inter)>();

где SomeClass реализует ISomeInterface. Но это не скомпилируется, так как CreateNew () нуждается в указанном фактическом типе. Я не знаю, возможно ли предоставить что-то подобное во время выполнения, но приведенный выше код не компилируется.

Итак, у меня есть экземпляр неизвестного ссылочного типа, и мне нужно создать несколько экземпляров одного типа.

Кто-нибудь знает методику достижения такого поведения?

Ответы [ 2 ]

10 голосов
/ 20 января 2009

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

Я предлагаю вам использовать Activator.CreateInstance(inter.GetType());

1 голос
/ 20 января 2009

Вы можете сделать это с помощью лямбды:

Function<ISomeInterface> creationDelegate;
if (selection == 1)
    creationDelegate = () => CreateNew<SomeClass>;
else
    creationDelegate = () => CreateNew<SomeClass2>;
ISomeInterface inter = creationDelegate();

// ...
ISomeInterface inter2 = creationDelegate();

Я не вижу преимущества использования метода CreateNew в этом случае на основе вашего примера кода, но я предполагаю, что ваш "настоящий" код более сложный.

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