클래스 개체를 사용하지 않고 비공개 멤버에 액세스 할 수 있습니까?
아니요. 해당 개체의 데이터를 가져 오려면 개체의 인스턴스가 있어야합니다.
위법은 아닙니다.하지만 생성자 오버로딩으로 인해 Reflection을 사용하는 것에 대한 주저는 의심스러워합니다. 인스턴스가 있거나 리플리렉션을 만들지 않으면 리플렉션을 사용하지 못하게해야합니다.
다음은 Reflection을 사용하여 _ink
에서 값을 가져 오는 예제입니다. 또한 생성자를 사용하지 않고 인스턴스를 가져 오는 방법을 보여줍니다. 그러나 은 없습니다.은 초기화됩니다. 코드에서 볼 때 _ink
은 0
이 아니고 1000
이 아닙니다. FormatterServices
클래스를 사용하기 위해
public class Pen
{
int _ink = 1000;
public Pen(int ink)
{
_ink = ink;
}
}
void Test()
{
//Create the object and check constructor set the value
var pen = new Pen(5);
var field = pen.GetType().GetField("_ink", BindingFlags.NonPublic|BindingFlags.Instance);
// This should pass.
Debug.Assert((int)field.GetValue(pen) == 5);
// Create the pen without using constructor.
// No matter what, nothing is initialized meaning _ink is 0 and not 1000.
// Hence, uninitialized.
var uninitializedPen = (Pen)FormatterServices.GetUninitializedObject(typeof(Pen));
field = uninitializedPen.GetType().GetField("_ink", BindingFlags.NonPublic|BindingFlags.Instance);
//This will fail.
Debug.Assert((int)field.GetValue(uninitializedPen) == 1000);
}
, 당신은 System.Runtime.Serialization
네임 스페이스를 가져와야합니다.
일반적으로 비공개 회원을 테스트해서는 안됩니다. 테스트가 그들에게 접근 할 필요가 있다면 디자인을 재고해야합니다. 그 사치품이 없을 때, 나는 보통 반성을 사용합니다. – phoog
리플렉션을 사용하는 방법을 알고 있지만 그 이유는 생성자 오버로드가 여기에 있기 때문입니다. –
필드 및 생성자 오버로드에 액세스하는 것과 어떻게 관련이 있습니까? –