C# - 부모의 필드/프로퍼티에 대해 서로 다른 자식 클래스 간에 Reflection 접근이 동작할까요?
제목만으로는 상황 설명이 안 되는군요. ^^ 역시 코드를 봐야 합니다.
예를 들어, 아래와 같은 상속 관계를 가질 때,
abstract class Base
{
public int Value = 50;
public abstract string Name { get; set; }
}
class Derived1 : Base
{
string _name = "test1";
public override string Name { get => _name; set => _name = value; }
}
class Derived2 : Base
{
string _name = "test";
public override string Name { get => _name; set => _name = value; }
}
상속을 받은 Derived1 타입을 기준으로 Type.GetField, Type.GetProperty를 호출해 얻은 FieldInfo, PropertyInfo가 (같은 부모 타입을 상속한) Derived2 타입을 기준으로 사용할 수 있을까요?
간단하게 테스트를 하면 됩니다. 우선, FieldInfo는,
FieldInfo? fi = typeof(Derived1).GetField("Value");
if (fi != null)
{
{
Derived1 instance = new Derived1();
Console.WriteLine(fi.GetValue(instance)); // 출력 결과: 50
}
{
Derived2 instance = new Derived2();
Console.WriteLine(fi.GetValue(instance)); // 출력 결과: 50
}
}
잘 동작합니다. 반면, PropertyInfo는,
PropertyInfo? pi = typeof(Derived1).GetProperty("Name");
if (pi != null)
{
{
Derived1 instance = new Derived1();
Console.WriteLine(pi.GetValue(instance)); // 출력 결과: test1
}
{
Derived2 instance = new Derived2();
Console.WriteLine(pi.GetValue(instance)); // 예외 발생
}
}
Derived1으로 구한 PropertyInfo를 Derived2 타입의 인스턴스에 사용하면 예외가 발생합니다.
Unhandled Exception: System.Reflection.TargetException: Object does not match target type.
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at System.Reflection.PropertyInfo.GetValue(Object obj)
at ConsoleApp1.Program.Main(String[] args)
대신 Derived1이 아닌 부모 타입을 사용하면,
PropertyInfo? pi = typeof(Base).GetProperty("Name");
// ...[생략]...
Derived1, Derived2 인스턴스 모두에서 예외 없이 잘 동작합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]