2012-06-13 28 views
1

我通过使用object.GetType()。GetProperty(字符串属性名称)反射recrusively评估属性。反射不提取值:密封类有一个属性,它是另一个密封类的对象。

这是工作正常的情况下,obj是密封类,但具有属性作为正常公共类的对象。但是,如果此属性包含一个密封的类对象,它不会通过GetProperty()方法返回任何属性。

尝试通过Prpty1 - > Prpty2 - > Prpty3从Baseclass对象递归迭代。 param.Properties包含Prpty1,Prpty2,Prpty3的字符串数组。我们无法获得Prpty2,它会以Null的形式出现。使用下面为此访问所写的方法。

示例代码如下:

//Methods below are used to extract value from Object (basically BaseClass Object) 

private string EvaluateObject(object obj, MappedParameter param) 
    { 
     object evaluatedObj = obj; 
     foreach (string s in param.Properties) 
     { 
      evaluatedObj = EvalProperty(evaluatedObj, s); 
     } 
     return (evaluatedObj == obj ? null : evaluatedObj.ToString()); 
    } 

    private object EvalProperty(object obj, string propertyName) 
    { 
     System.Reflection.PropertyInfo propInfo = obj.GetType().GetProperty(propertyName); 
     if (propInfo == null) 
      throw new Exception("Invalid Property token"); 
     object propertyValue = propInfo.GetValue(obj, null); 
     return propertyValue; 
    } 


//Below classes are Data Wrappers 

namespace TryClassLibrary 
{ 
public class BaseClass 
{ 
    private NestedClass _Data = new NestedClass();  

    public NestedClass Prpty1 
    { 
     set { _Data = value; } 
     get { return _Data; } 
    } 
} 
} 

namespace TryClassLibrary 
{ 
public sealed class NestedClass 
{ 
    public int Id { get; set; } 

    public NestedNestedClass Prpty2 = new NestedNestedClass(); 
} 

public sealed class NestedNestedClass 
{ 
    private string _Message; 

    public NestedNestedClass() 
    { 
     Prpty3 = "Test value"; 
    } 

    public string Prpty3 
    { 
     set 
     { 
      _Message = value; 
     } 
     get { return _Message; } 
    } 
} 
} 

可以请别人帮我找到访问Prpty2,Prpty3或者是在使用反射一些现有的约束方式。谢谢。

+1

你有这个可运行的例子吗? 'sealed'不会以任何方式影响'GetProperty' * AFAIK。我会怀疑这个问题是非常不同的 - 很可能“Type”在某个时刻已经感到困惑,而且你正在寻找错误的类型。 –

+0

是的标记我做了一个控制台应用程序正在测试这个,我发现NestedClass对象不能通过GetProperty()方法获得Prpty2。 PropertyInfo对象将作为Null来使用。 –

回答

2

嗯,问题很简单:Prpty2不是属性:它是一个场:

public NestedNestedClass Prpty2 = new NestedNestedClass(); 

应该是:

private readonly NestedNestedClass prpty2 = new NestedNestedClass(); 
public NestedNestedClass Prpty2 { get { return prpty2; } } 

(或类似)

然后它的全部作品:

object obj = new BaseClass(); 
obj = obj.GetType().GetProperty("Prpty1").GetValue(obj, null); 
obj = obj.GetType().GetProperty("Prpty2").GetValue(obj, null); 
obj = obj.GetType().GetProperty("Prpty3").GetValue(obj, null); 
string s = obj.ToString(); // "Test value" 

有关信息,如果您正在做很多这样的 - 也许看看FastMember;这是更方便,并严重优化,以便不支付反映税。