我有这个代码,我目前正在适应使用嵌套实体(实体框架)。我有一个实体,其中包含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控件)。)
答案 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();
}
}
}
}
}
}
目前它有效,但在不久的将来它可能不够通用。