이 수업이 주어지면
class Foo
{
// Want to find _bar with reflection
[SomeAttribute]
private string _bar;
public string BigBar
{
get { return this._bar; }
}
}
속성으로 표시 할 개인 항목 _bar를 찾고 싶습니다. 가능합니까?
속성을 찾은 속성을 사용했지만 개인 멤버 필드는 사용하지 않았습니다.
개인 필드를 얻기 위해 설정해야 할 바인딩 플래그는 무엇입니까?
답변
사용 BindingFlags.NonPublic
및 BindingFlags.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
}