Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

(시리즈 글이 11개 있습니다.)
.NET Framework: 404. 리플렉션을 이용해 닷넷 LicenseManager를 우회할 수 있는 사례
; https://www.sysnet.pe.kr/2/0/1565

.NET Framework: 428. .NET Reflection으로 다차원/Jagged 배열을 구분하는 방법
; https://www.sysnet.pe.kr/2/0/1653

.NET Framework: 537. C# - Reflection의 박싱 없이 값 형식을 다루는 방법
; https://www.sysnet.pe.kr/2/0/10866

.NET Framework: 685. C# - 구조체(값 형식)의 필드를 리플렉션을 이용해 값을 바꾸는 방법
; https://www.sysnet.pe.kr/2/0/11312

.NET Framework: 785. public으로 노출되지 않은 다른 어셈블리의 delegate 인스턴스를 Reflection으로 생성하는 방법
; https://www.sysnet.pe.kr/2/0/11583

.NET Framework: 842. .NET Reflection을 대체할 System.Reflection.Metadata 소개
; https://www.sysnet.pe.kr/2/0/11930

.NET Framework: 924. C# - Reflection으로 변경할 수 없는 readonly 정적 필드
; https://www.sysnet.pe.kr/2/0/12256

.NET Framework: 1045. C# - 런타임 시점에 이벤트 핸들러를 만들어 Reflection을 이용해 구독하는 방법
; https://www.sysnet.pe.kr/2/0/12609

.NET Framework: 1046. C# - 컴파일 시점에 참조할 수 없는 타입을 포함한 이벤트 핸들러를 Reflection을 이용해 구독하는 방법
; https://www.sysnet.pe.kr/2/0/12610

닷넷: 2155. C# - .NET 8 런타임부터 (Reflection 없이) 특성을 이용해 public이 아닌 멤버 호출 가능
; https://www.sysnet.pe.kr/2/0/13436

닷넷: 2249. C# - 부모의 필드/프로퍼티에 대해 서로 다른 자식 클래스 간에 Reflection 접근이 동작할까요?
; https://www.sysnet.pe.kr/2/0/13608




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 인스턴스 모두에서 예외 없이 잘 동작합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 4/26/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  [169]  170  171  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
841정성태3/16/201028758.NET Framework: 174. 작업자 프로세스(w3wp.exe)가 재시작되는 시점을 알 수 있는 방법 [1]
840정성태3/4/201022068개발 환경 구성: 71. w3wp.exe에 환경 변수 전달하는 방법 [1]
836정성태2/13/201025493VS.NET IDE: 67. Visual Studio 2010: 베타 2에서 RC 마이그레이션
835정성태1/26/201026816.NET Framework: 173. WCF - webHttpBinding + IIS 6.0 윈도우 인증 구현 예제 [3]파일 다운로드1
834정성태1/25/201027318.NET Framework: 172. WCF - webHttpBinding 윈도우 인증 구현 예제 [3]파일 다운로드1
833정성태1/25/201026767.NET Framework: 171. WCF - webHttpBinding 구현 예제 [1]파일 다운로드1
832정성태1/25/201030407.NET Framework: 170. PerformanceCounter의 RawValue/NextValue()에서 멈춤 현상
831정성태1/14/201020185개발 환경 구성: 70. WSS - check out 메뉴에서 오류나는 문제
830정성태1/10/201024923개발 환경 구성: 69. Windows Internal Database
829정성태1/7/201024174개발 환경 구성: 68. ODP.NET + OraMTS 사용
828정성태1/7/201031939개발 환경 구성: 67. 환경 변수를 이용한 다중 ODAC 버전 테스트
827정성태1/4/201024255개발 환경 구성: 66. .NET 응용 프로그램에서 64비트 Oracle Data Access Components 사용 (2)
826정성태1/3/201031809기타: 28. 2009년 인기 순위 정리
825정성태1/3/201048563개발 환경 구성: 65. .NET 응용 프로그램에서 64비트 Oracle Data Access Components 사용 [5]
823정성태1/1/201025650개발 환경 구성: 64. ODP.NET 설치 작업 없이 ASP.NET 응용 프로그램 배포파일 다운로드1
822정성태1/1/201088194개발 환경 구성: 63. ODP.NET 설치 없이 .NET 클라이언트 프로그램 배포하는 방법 [6]파일 다운로드2
821정성태1/1/201050894개발 환경 구성: 62. .NET 응용 프로그램에서 Oracle XE 사용 [1]
820정성태12/29/200922403개발 환경 구성: 61. Oxite 소스 코드를 Visual Studio 2010으로 마이그레이션파일 다운로드1
818정성태12/27/200920978개발 환경 구성: 60. Cassini 서버를 localhost 이외의 주소에서 접근하도록 변경
817정성태12/21/200922570개발 환경 구성: 59. WebDev 2.0에서 실행하는 Pet Shop 4.0
816정성태12/19/200924251개발 환경 구성: 58. Pet Shop 4.0을 IIS 없이 실행하는 방법 [1]파일 다운로드1
815정성태12/18/200927097개발 환경 구성: 57. Pet Shop 4.0 - SQL Server Compact Edition Version - 두 번째 이야기파일 다운로드1
814정성태12/16/200922299오류 유형: 91. VS2010 beta2 - The application cannot start
812정성태12/11/200926159개발 환경 구성: 56. Pet Shop 4.0 - SQL Server Compact Edition Version파일 다운로드2
811정성태12/2/200939993.NET Framework: 169. [in, out] 배열을 C#에서 C/C++로 넘기는 방법 - 두 번째 이야기 [8]파일 다운로드2
810정성태12/1/200936163.NET Framework: 168. [in,out] 배열을 C#에서 C/C++로 넘기는 방법 [3]
... 166  167  168  [169]  170  171  172  173  174  175  176  177  178  179  180  ...