0

フィールドにある CustomAttributes などの目的で FieldInfo にアクセスしたいのですが、文字列を使用してそのフィールドにアクセスしたり、クラス内のすべてのフィールドを実行したりする必要はありません。

私が単に持っている場合、

class MyClass
{
#pragma warning disable 0414, 0612, 0618, 0649
    private int myInt;
#pragma warning restore 0414, 0612, 0618, 0649

    public MyClass()
    {
        BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
        Console.WriteLine( GetType().GetField("myInt", flags) );

        foreach( FieldInfo fi in GetType().GetFields(flags) )
        {
            Console.WriteLine( string.Format("{0} {1} {2}", fi.Name, myInt, fi.GetValue(this) ) );
        }
    }
}

「GetField」関数を介して直接「myInt」の FieldInfo にアクセスできることを知っています。その名前の文字列がある場合、または「GetFields」を循環する場合は、「myInt」という文字列を持つことに再び依存します。右のフィールドを確認してください。

ref myInt、またはout myInt、またはアクセスできるまだ知らないキーワードのような利用可能な魔法はありますか、またはそれを取得するために文字列名が必要に制限されていますか?

4

2 に答える 2

2

文字列ではなく、コンパイルされた式からメンバー情報を取得するということですか? 例えば

class Program
{
    public static void Main()
    {
        var cls = new MyClass();
        Console.WriteLine(GetMemberInfo(cls, c => c.myInt));
        Console.ReadLine();
    }

    private static MemberInfo GetMemberInfo<TModel, TItem>(TModel model, Expression<Func<TModel, TItem>> expr)
    {
        return ((MemberExpression)expr.Body).Member;
    }

    public class MyClass
    {
        public int myInt;   
    }
}
于 2015-02-26T20:38:21.923 に答える