C# 动态绑定到属性

C# 动态绑定到属性,c#,entity-framework,C#,Entity Framework,嗨,我使用实体框架作为我的映射器,我有dropDownList,我想在代码behinde DataTextField中设置类的某个属性,但我不想使用someProperty静态设置,因为如果在我的模型中有更改字段,这个地方会出现异常。如果属性名称将发生更改,那么绑定将指向更改后的属性,我该怎么做 我找到了更好的解决方案: public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn&

嗨,我使用实体框架作为我的映射器,我有dropDownList,我想在代码behinde DataTextField中设置类的某个属性,但我不想使用someProperty静态设置,因为如果在我的模型中有更改字段,这个地方会出现异常。如果属性名称将发生更改,那么绑定将指向更改后的属性,我该怎么做

我找到了更好的解决方案:

public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
    {
        MemberExpression body = (MemberExpression)expression.Body;
        return body.Member.Name;
    }

所以这不是静态字符串,但我仍然不高兴,因为当我更改实体模型中的字段时,这里有一个错误,这是否可能随着模型的更改,此绑定也会更改?

我们在数据绑定之前将业务对象映射到匿名对象,如下所示:

var objectsToBindToDropdown = businessObjects.Select(o => new 
    {
        SomeProperty1 = o.BusinessProperty1, 
        SomeProperty2 = o.BusinessProperty2
    });

dropDownList.DataTextField  = "SomeProperty1";
// TODO: bind the drop down list

如果模型发生更改,例如BusinessProperty1被重命名为另一个BusinessProperty1,您将得到编译错误,而这正是目标。

否,这是不可能的。当您的模型更改时,您必须更新您的代码以使用新的属性名称等。顺便说一句,您的解决方案非常好,消除了硬编码字符串的需要:
var objectsToBindToDropdown = businessObjects.Select(o => new 
    {
        SomeProperty1 = o.BusinessProperty1, 
        SomeProperty2 = o.BusinessProperty2
    });

dropDownList.DataTextField  = "SomeProperty1";
// TODO: bind the drop down list