Общий класс & Type.GetType () - PullRequest
       6

Общий класс & Type.GetType ()

10 голосов
/ 24 сентября 2010

Немного загадки, у меня есть общий класс

public abstract class MyClass<T> : UserControl
{

}

и у меня есть такой тип

Type type = Type.GetType("Type From DB as String", true, true);

и я хочу создать экземпляр MyClass, используя тип ... Но это не работает.

MyClass<type> control = (MyClass<type>)LoadControl("/UsercControl.ascx");

Есть идеи ????

Ответы [ 4 ]

15 голосов
/ 24 сентября 2010

Примерно так:

Type typeArgument = Type.GetType("Type From DB as String", true, true);
Type template = typeof(MyClass<>);
Type genericType = template.MakeGenericType(typeArgument);
object instance = Activator.CreateInstance(genericType);

Теперь вы не сможете использовать в качестве MyClass<T> с точки зрения вызова методов для него, потому что вы не знаете T ... но вы можете определить неуниверсальный базовый класс или интерфейс с некоторыми методами, в которых не требуется T, и приведен к нему. Или вы можете вызвать методы через рефлексию.

1 голос
/ 24 сентября 2010

Обобщения в отражении немного сложнее, чем это.Вам нужны методы GetGenericTypeDefinition () и MakeGenericType ().Возьмите ваш универсальный тип (вы можете получить его, вызвав GetType () для экземпляра или используя typeof (MyClass<Object>)), и вызовите GetGenericTypeDefinition (), чтобы получить базовый открытый универсальный тип (MyClass<T>).Затем для этого типа вызовите MakeGenericType () и передайте ему массив с одним элементом;тип, который вы хотите использовать, чтобы закрыть универсальный.Это приведет к закрытию универсального типа с вашим динамически обнаруженным типом (MyClass<MyType>), который вы можете передать Activator.CreateInstance ().

0 голосов
/ 24 сентября 2010

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

Подробнее см. http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx.

0 голосов
/ 24 сентября 2010

Вы создаете новые объекты, используя отражение:

type.GetConstructor(new Type[]{}).Invoke(new object[]{});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...