0

我有这段代码,我目前正在适应使用嵌套实体(实体框架)。我有一个包含 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中包含的另一个部分类。metadatadatasource

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

4

2 回答 2

0

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

var propList = this.datasource.GetType().GetProperties()
于 2012-11-21T22:53:25.597 回答
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();
                    }
                }
            }
        }
    }
}

目前它可以工作,但在不久的将来它可能还不够通用。

于 2012-11-22T22:15:25.283 回答