14

クラスインスタンスから自動的にSQLステートメントを生成したいです。メソッドはUpdate(object [] Properties、object PrimaryKeyProperty)のようになります。このメソッドはインスタンスの一部です(クラス、基本メソッド - すべての子に共通)。プロパティの配列はクラスプロパティの配列です。これはで使用されます。更新ステートメント。プロパティ名はテーブルフィールド名と同じです。

問題は、私がプロパティ名を取得できないことです。

クラスインスタンス内でプロパティ名を取得するためのオプションはありますか? サンプル:

public class MyClass {
public int iMyProperty { get; set; }
public string cMyProperty2 { get; set; }
{

main() {
 MyClass _main = new MyClass();

_main.iMyProperty.*PropertyName* // should return string "iMyProperty"

{

私はPropertyInfoを知っていますが、GetProperties()配列からプロパティのIDを取得するのが辛いことは知りません。

なにか提案を?

7 답변


28

この実装を書いただけで先週の火曜日に私達のユーザーグループのためにラムダについてのプレゼンテーションをしてください。

  • できるよ

    MembersOf< Animal> .GetName(x => x.Status)

  • または

    var a = new Animal()    a.MemberName(x => x.Status)

コード:

public static class MembersOf<T> {
    public static string GetName<R>(Expression<Func<T,R>> expr) {
        var node = expr.Body as MemberExpression;
        if (object.ReferenceEquals(null, node)) 
            throw new InvalidOperationException("Expression must be of member access");
        return node.Member.Name;
    }
}


  • こんにちはジョージさん、あなたの解決策は入れ子になったLambdaのように動作しないMembersOf< Animal> .GetName(x => x.Gender.Text)は" Text"ではなく" Gender.Text"を与えるべきです。 - Stef Heyenrath
  • @Stef、それは正しいです。 x.Gender.Textはメンバーアクセサではありません。実装を確認してください。構文ツリー全体を検出して繰り返し再帰させるのは比較的簡単なはずです。 - George Mauer
  • LukeHからの回答stackoverflow.com/questions/3049825/…まさに私が必要としているものです。 - Stef Heyenrath
  • @GeorgeMauer交換しない理由MembersOf<T>.GetName<R>(Expression<Func<T,R>> expr)MembersOf.GetName<T>(Expression<Func<T,Object>> expr)これは簡単で、特定のRタイプは必要ありません(コンパイル時に推測される場合でも)。 - Yves M.
  • @YvesMどのような利点がありますか? - George Mauer

10

私は完璧な解決策を見つけましたこの郵便受け

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
   return (propertyExpression.Body as MemberExpression).Member.Name;
}

そして使用法のために:

var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"

魅力のように働く


7

あなたはこのようなことをすることができます:

Type t = someInstance.getType();

foreach (MemberInfo mi in t.GetMembers())
{
    if (mi.MemberType == MemberTypes.Property)
    {
        Console.WriteLine(mi.Name);
    }
}

のすべてのプロパティ名を取得するinstanceのタイプ


  • 特定の名前だけで、すべてのプロパティ名が欲しくない - George Mauer
  • それがマイナス投票に値するかどうかわからない。 "クラスインスタンス内にプロパティ名を取得するためのオプションはありますか?"印刷を実行するループが表示されましたすべてクラスインスタンス内のプロパティ名。ただし、更新したいものはすべて更新手続きに渡すことができます。問題が何であるかわかりません。 - Vinay Sajip

2

あなたはPropertyInfo.Nameを使ってプロパティの名前(私はそれがあなたがIDによって意味するものであると仮定します)を得ることができます。 typeof(className).GetProperties()から返されたPropertyInfo []をループするだけです。

foreach (PropertyInfo info in typeof(MyClass).GetProperties())
{
    string name = info.Name;
    // use name here
}


  • 私はこれのためにあなたに+10を与えることを願っています:) - Eric Herlitz

1

あなたが望む特定のプロパティへの明示的なハンドルをすでに持っているので、あなたは名前を知っています - あなたはただそれをタイプすることができますか?


  • 私は彼がコードが派生クラスに対しても機能することを望んでいると思うので、彼はリフレクションを使用する必要があります。 - Zach Johnson
  • 主な考え方は、名前を重複させないことです。そのため、(属性を持つ)クラスが書かれると、自動テーブル生成、CRUDステートメント、そしてインテリセンス。 - FrenkR

1

これであなたが探しているものが得られるかどうかは100%わからない、これはあなたのクラスの中で[Column]属性を持つすべてのプロパティを取得するだろう: データコンテキストでは、私は持っています:

 public ReadOnlyCollection<MetaDataMember> ColumnNames<TEntity>( )
    {
        return this.Mapping.MappingSource.GetModel(typeof(DataContext)).GetMetaType(typeof(TEntity)).DataMembers;
    }

クラス内のプロパティであるテーブルcolumn-namesを取得します。

       MyDataContext db = GetDataContext(); 
       var allColumnPropertyNames =   db.ColumnNames<Animal>().Where(n => n.Member.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).FirstOrDefault() != null).Select(n => n.Name);


1

と言いましょう(最初のサンプルから、クラスのメソッド更新MyClass):

public class MyClass {

public int iMyStatusProperty { get; set; }
public int iMyKey { get; set; }

public int UpdateStatusProperty(int iValue){
this.iMyStatusProperty = iValue;
return _Update( new[iMyStatusProperty ], iMyKey); // this should generate SQL: "UPDATE MyClass set iMyStatusProperty = {iMyStatusProperty} where iMyKey = {iMyKey}"
}

{iMyStatusProperty}そして{iMyKey}クラスインスタンスのプロパティ値です。

だから、問題はプロパティ名を取得する方法です(反射プロパティ名を文字列として使用せずにプロパティから(フィールド名の入力ミスを避けるため)。

リンクされた質問


関連する質問

最近の質問