如何迭代T对象来查找属性?

时间:2012-11-21 22:50:27

标签: c# nested-class databinder

我有这个代码,我目前正在适应使用嵌套实体(实体框架)。我有一个实体,其中包含2个属性,它们是2个子实体。

第一步是从第一个类开始,读取两个类的元数据,构建一个属性列表。这完成了。现在我需要迭代我的对象以找到用于执行DataBinding的良好属性。

这就是我目前所拥有的:

变量示例:

datasource = namespace.A
propriete = {System.Nullable`1[System.Int32] count} 
propriete.DeclaringType {Name = "prop2" FullName = "Namespace.Metadata.prop2"}

代码:

if (this.datasource != null)
{
    var y = (T)this.datasource;

    var propList = typeof(T).GetProperties();
    if (propList.ToList().Contains(propriete))
    {
        TextBox.Text = DataBinder.Eval(y, propriete.Name).ToString();
    }
    else
    {
        TextBox.Text = ":( need child-support!";
    }
}

我的主要问题是我的对象类型在运行时是未知的(类型T)所以我不知道如何找到我的字段。

快速型号:

Class A {
  public B prop1;
  public C prop2;
}

Class B {
   int count;
   string name;
}

Class C {
   int count;
   string name;
}

A.prop1.count = 1;
A.prop1.name = "a";
A.prop2.count = 2;
A.prop2.name = "b";

现在,我的属性名称都是唯一的(比计数/名称更具体),但我希望它们在某些时候是相同的(计数/名称)。

propriete可能必须使用DeclaringType / ReflectedType“过滤”非唯一名称。

考虑到独特名称的蛮力解决方案虽然不是很优雅,但可能会被接受。

额外问题:propriete使用metadata命名空间中包含的另一个部分类,而datasource使用主类。

(...如果您对这个系统的作用感到好奇:它基于一个基于此metadata.entity dataAttribute的实体构建一个html表(带.net控件)。)

2 个答案:

答案 0 :(得分:0)

您可以通过在实例上调用GetType()来获取类型信息。所以在你的情况下,它将是:

var propList = this.datasource.GetType().GetProperties()

答案 1 :(得分:0)

这是我最终的结果:

if (this.datasource != null)
{
    var y = (T)this.datasource;

    var propList = typeof(T).GetProperties();
    //try to assign the prop but it might be on a child-prop.
    try 
    {           
        retour = DataBinder.Eval(y, propriete.Name).ToString();
    }
    catch 
    {
        foreach (PropertyInfo prop in propList)
        {
            if ((prop.PropertyType).FullName.Contains("Env."))
            {
                var childPropList = prop.PropertyType.GetProperties();
                foreach (PropertyInfo childProp in childPropList)
                {
                    if (((System.Reflection.MemberInfo)(childProp)).Name == propriete.Name)
                    {
                        var x = DataBinder.GetPropertyValue(y, prop.Name);
                        retour = DataBinder.Eval(x, propriete.Name).ToString();
                    }
                }
            }
        }
    }
}

目前它有效,但在不久的将来它可能不够通用。