2010-11-25 4 views
1

Я зацикливаюсь через ObjectStateEntry из EF, поэтому я могу получить доступ к enrty.Entity, я делаю некоторую статическую проверку на классах poco, и я также хочу проверить правильность бизнес-правил, поэтому я создал библиотеку, чтобы сделать что теперь у меня есть эта строка кода, которые ожидают типа excample клиента ..pass type to generic class

MyEntityValidator<needtypehere> ev = new MyEntityValidator<needtyehere>(new EntityValidator()); 

так что я имею проблему проходящее типа, где я mentiened «needtypehere». Я попробовал entry.Entity.GetType(), но не работал. Опять же это signiture метода

GetErrors(this ObjectStateEntry entry) 

ответ

5

Для вызова дженерики из Type в случае, вы должны использовать:

Type closedType = typeof(MyEntityValidator<>) 
     .MakeGenericType(entry.Entity.GetType()); 
object obj = Activator.CreateInstance(closedType); 

который ... неловко - как вы после этого нужно сделать много дополнительной работы с отражением. Кроме того, вы можете позвонить в общий метод, что делает код:

public static void InvokeGeneric<T>(...) { 
    MyEntityValidator<T> ev = new MyEntityValidator<T>(
     new EntityValidator()); 
    ... etc; lots more code that uses ev 
} 
... 
typeof(ContainingType).GetMethod("InvokeGeneric").MakeGenericMethod(
    entry.Entity.GetType()).Invoke(null, args); 
+0

@saurabh: Марк прав; использование типа времени выполнения (экземпляр класса `Type`) для получения ссылки на общий тип является неудобным и, как правило, не в духе реальных дженериков. Если вы контролируете структуру типа, то тот факт, что вам нужно это сделать (и может законно ссылаться на ваш класс и взаимодействовать с ним агентом типа-агностик) означает, что, вероятно, должен быть не общий базовый класс, а затем общие подклассы , – 2010-11-25 06:09:04