2014-01-15 2 views
1

Я перечисляю свойства EntityFramework Container. Через отражение я получаю только DbSet. Теперь мне нужно, чтобы получить доступ к значению свойства, и я попытался это так:C# cast Тип для типичного сильного типизированного

object obj = PropertyInfo.GetValue(myobject) 

Все здесь, но мне нужно, чтобы бросить его вещественного типа (я в идеале это нужно):

DbSet<MyRealType> obj = (DbSet<MyRealType>)PropertyInfo.GetValue(myobject); 

Но MyRealType во время компиляции неизвестно. Я получаю только Type, но могу отдать его DbSet<MyrealType>. Можно ли это достичь?

+2

Пожалуйста, добавьте тег языка. –

ответ

1

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

Другой вариант - указать значение dynamic, а затем попытаться (и надеяться), что ваши вызовы будут работать как ожидалось.

Таким образом, в вашей ситуации, вам лучше всего было бы, вероятно, использовать динамический тип:

dynamic obj = Propertyinfo.GetValue(myobject); 
obj.SomeMethodYouWantToCall(); // and catch DLR errors 
+0

Я пробовал динамический выход, но похоже, что методы расширения не будут называться (на самом деле это кажется совершенно очевидным). В любом случае, спасибо. – sam

+1

Вы все равно можете вызывать методы расширения с динамического объекта, это просто больше работы. IE: 'EnumerableExtensions.Select (obj, x => x.SomeProperty)' для того, что обычно было бы 'obj.Select (x => x.SomeProperty)'. Методы расширения - это просто синтаксический сахар = D – Tejs

Смежные вопросы