Есть ли обратная операция typeof? - PullRequest
2 голосов
/ 13 сентября 2010

Я получил Тип, но это не то же самое, что Класс, который я ищу.

Есть ли обратная операция typeof?

EDIT

Мне нужен класс, чтобы использовать общий репозиторий:

GenericRepository<BaseEntity> repository = new GenericRepository<BaseEntity>(new AzureBrightData());

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

Например, если у нас есть пара комбинаций ключа раздела и ключа строки (1,1), это не позволяет мне или хранилищу узнать, из какой таблицы получить реестр. Этого недостаточно, и поэтому я считаю, что мне нужен стол.

Ответы [ 7 ]

7 голосов
/ 13 сентября 2010

Если я не понял ответы по вашему вопросу, то, возможно, вы ищете что-то вроде этого (экземпляр типа):

     Assembly asmApp = Assembly.LoadFile("some.dll");
     Type tApp = asmApp.GetType("Namespace.SomeClass");
     object oApp = Activator.CreateInstance(tApp, new object[0] { });
3 голосов
/ 16 сентября 2010

Я буду основывать свой ответ на пояснениях, которые вы предоставили в комментарии:

Я неправильно понял то, что все говорили здесь, или, по крайней мере, я не дал понять, что ясно.Я хочу получить класс, как я бы использовал его в обычном режиме.Например, я должен передать класс следующим образом: public void methodName<T>(), где T - это класс.

Краткий ответ : Нет, вы не можете, потому что универсальныйтипы разрешаются во время компиляции.

Длинный ответ : Да, вы можете, но вам нужно использовать рефлексию.Вот как вы это делаете:

3 голосов
/ 13 сентября 2010

Используйте класс «Активатор»:

Activator.CreateInstance<T>
2 голосов
/ 13 сентября 2010

Я думаю, что вы ищете Activator.CreateInstance .

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

Я должен что-то упустить.Ответы, представленные до сих пор, похоже, не совпадают с вопросами.Мне бы хотелось больше ясности.

Тем не менее я постараюсь ответить на вопрос так, как я его вижу.

Вы говорите, что пытаетесь это сделать:

var repository = new GenericRepository<BaseEntity>(new AzureBrightData());

Вы пытаетесь сделать что-то более похожее на это?

var repository = new GenericRepository<AzureBrightData>();

Если это так, то ваш родовой класс хранилища должен быть определен так:

public class GenericRepository<T> where T : BaseEntity, new()
{
    ...
}

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

Надеюсь, я понял ваш вопрос.

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

Вот несколько вариантов, перечисленных в порядке моих предпочтений. Я предполагаю, что T является параметром типа в вашем родовом классе или методе.

new T(); // T must be constrained to support a default constructor.

или

Activator.CreateInstance(typeof(T), new object[] { });

или

typeof(T).GetConstructor(new Type[] { }).Invoke(null);

или

AppDomain.CurrentDomain.CreateInstanceAndUnwrap(typeof(T).Assembly.FullName, typeof(T).FullName);
1 голос
/ 13 сентября 2010

Использовать ограничение new ().

public T Create<T>() where T : new() {
    return new T();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...