2011-01-07 44 views
1

現在、コードビハインドからコントロールにバインドしています。例えばEntity Frameworkエンティティの列名を取得して型を整える

  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

答えて

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

関連する問題