[C#] 리플렉션이있는 개인 필드를 찾으십니까?

이 수업이 주어지면

class Foo
{
    // Want to find _bar with reflection
    [SomeAttribute]
    private string _bar;

    public string BigBar
    {
        get { return this._bar; }
    }
}

속성으로 표시 할 개인 항목 _bar를 찾고 싶습니다. 가능합니까?

속성을 찾은 속성을 사용했지만 개인 멤버 필드는 사용하지 않았습니다.

개인 필드를 얻기 위해 설정해야 할 바인딩 플래그는 무엇입니까?



답변

사용 BindingFlags.NonPublicBindingFlags.Instance플래그

FieldInfo[] fields = myType.GetFields(
                         BindingFlags.NonPublic |
                         BindingFlags.Instance);


답변

속성과 마찬가지로 할 수 있습니다.

FieldInfo fi = typeof(Foo).GetField("_bar", BindingFlags.NonPublic | BindingFlags.Instance);
if (fi.GetCustomAttributes(typeof(SomeAttribute)) != null)
    ...


답변

Reflection을 사용하여 개인 변수의 값을 얻습니다.

var _barVariable = typeof(Foo).GetField("_bar", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(objectForFooClass);

리플렉션을 사용하여 개인 변수의 값을 설정하십시오.

typeof(Foo).GetField("_bar", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(objectForFoocClass, "newValue");

여기서 objectForFooClass는 클래스 유형 Foo의 널이 아닌 인스턴스입니다.


답변

개인 구성원에 반영 할 때 알아야 할 한 가지는 응용 프로그램이 중간 신뢰 수준에서 실행되는 경우 (예 : 공유 호스팅 환경에서 실행중인 경우) 해당 응용 프로그램을 찾을 수 없다는 것입니다. BindingFlags.NonPublic 옵션은 단순히 무시됩니다.


답변

typeof(MyType).GetField("fieldName", BindingFlags.NonPublic | BindingFlags.Instance)


답변

확장 방법을 사용한 멋진 구문

다음과 같은 코드를 사용하여 임의 유형의 개인 필드에 액세스 할 수 있습니다.

Foo foo = new Foo();
string c = foo.GetFieldValue<string>("_bar");

이를 위해 작업을 수행 할 확장 방법을 정의해야합니다.

public static class ReflectionExtensions {
    public static T GetFieldValue<T>(this object obj, string name) {
        // Set the flags so that private and public fields from instances will be found
        var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
        var field = obj.GetType().GetField(name, bindingFlags);
        return (T)field?.GetValue(obj);
    }
}


답변

이 방법을 개인적으로 사용합니다

if (typeof(Foo).GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Any(c => c.GetCustomAttributes(typeof(SomeAttribute), false).Any()))
{
    // do stuff
}