2011-01-07 84 views
1

我目前正在綁定到來自代碼隱藏的控件。通過獲取實體框架實體列名來實現類型安全

例如:

  var ctx = new MyEntities(); 
      var source = from o in ctx.Users 
         select o; 

      myControl.DataSource = source; 
      myControl.DataTextField = "SomeColumn1"; // Can I not typesafe this? 
      myControl.DataValueField = "Somecolumn2"; 
      myControl.DataBind(); 

理想我想從EF獲得的屬性名稱。其他ORM傾向於爲Enum提供所有可用的屬性名稱。 EF不是這種情況嗎?

+0

可能是值得重新標籤,問題是沒有嚴格的關於EF? – RichardW1001 2011-01-07 11:04:03

回答

1

無論ORM是否將其作爲內置函數,您都可以使用反射作爲擴展方法來完成此操作。

這是在VB:

<Extension()> 
    Public Function PropertyName(Of T, TProperty)(ByVal targetObject As T, ByVal expression As Expression(Of Func(Of T, TProperty))) As String 
     Return DirectCast(expression.Body, Expressions.MemberExpression).Member.Name 
    End Function 

所以這會給你這樣的:

myControl.DataSource = source 
myControl.DataTextField = source.First().PropertyName(Function(x) x.SomeColumn1) 
myControl.DataValueField = source.First().PropertyName(Function(x) x.SomeColumn2) 
myControl.DataBind() 

(我使用source.First(),因爲擴展方法是一個實例類,而不是實例的集合)的

而且我注意到您原來的職位是在C#:

[Extension()] 
public string PropertyName<T, TProperty>(T targetObject, Expression<Func<T, TProperty>> expression) 
{ 
    return ((Expressions.MemberExpression)expression.Body).Member.Name; 
} 

而且

myControl.DataSource = source; 
myControl.DataTextField = source.First().PropertyName(x => x.SomeColumn1); 
myControl.DataValueField = source.First().PropertyName(x => x.SomeColumn2); 
myControl.DataBind(); 
+0

謝謝理查! – DaveHogan 2011-01-10 08:05:26