2013-08-24 2 views
2

Я использую широко используя foovar.GetType().GetProperty("PropertyName").GetValue(foovar), чтобы получить значение свойства переменной переменной через отражение. Но, похоже, он не работает с типами интерфейсов.Получить свойства интерфейса через отражение

IFoo foo = GetFoo(); 
string fooName= foo.Name; //It works perfectly 

Я работаю с третьей стороной, поэтому у меня нет доступа к реализации. Существует свойство «Имя», и я могу получить значение. Но не может через отражение.

Когда я пытаюсь string s = (string)foo.GetType().GetProperty("Name").GetValue(foo); я получить нулевую ошибку: нет свойства «Name»

Я проверил PropertyInfo[] pi = foo.GetType().GetProperties(); и я могу увидеть около 200 свойств, ни один из них не является «Name». На самом деле многие другие «свойства intellisense» не появляются.

¿Как я могу получить значение свойства типа интерфейса?

Спасибо!

+0

Зачем вам нужно размышление? Вы пытались взглянуть на имплантацию с помощью ILSpy, dotPeek или Reflector? –

+0

У меня есть тип, который мне нужен для доступа во время выполнения. У него много, разных типов. Я получаю имена свойств и типы свойств, которые мне нужно использовать каждый раз через базу данных или XML, а затем использовать рефлексию и дженерики для получения vaules. – Kaikus

ответ

2

Объект недвижимости не может быть IFoo, поэтому собственность Name будет закрыта. Вы можете использовать тип интерфейса вместо:

object property = typeof(IFoo).GetProperty("Name").GetValue(foo); 

EDIT: Если это не сработает, то я могу только предположить, свойство фактически определяется на какой-либо другой интерфейс, который реализует IFoo например,

public interface IBase 
{ 
    string Name { get; } 
} 

public interface IFoo : IBase 
{ 
} 

В этом случае вы должны будете найти фактический интерфейс, который декларирует Name и использовать его.

+0

Извините, он продолжает давать мне ошибку. На самом деле, когда я пытаюсь «typeof (IFoo) .GetProperties()« Я имею те же свойства, что и при попытке foo.GetType(). Getproperties() ' – Kaikus

+0

@Kaikus - я обновил ответ - Помогите? – Lee

+0

Спасибо! Следуя своей идее, в редакторе, «toughus intellisense», я вижу, что свойство в IFoo определяется как «строка IBase.Name». Таким образом, решение is'string s = (string) typeof (IBase) .GetProperty («Name»). GetValue (foo); ' даже если «foo» определяется как IFoo. :) Кстати, вы знаете какой-либо способ запросить интерфейс о своей реализации, чтобы я мог получить это (имя на самом деле IBase.Name) через код? – Kaikus

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