2017-12-28 48 views
0

문제가 있습니다.C# 비공개로 투입 할 수 없음

유니티에서는 사적인 분야에 대해 생각하고 싶습니다. 하지만 난 항상 fieldinfo null이됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

public abstract class _SerializableType 
{ 
    [SerializeField] private string name; 
} 

// because I am using a CustomPropertyDrawer for all inherited from _SerializeType 
public class SerializableType<T> : _SerializableType { } 
public class SerializableType : _SerializableType { } 

[Serializable] public class CTech : SerializableType<_CouplingTechnology> { } 

이 방법을 사용하면 실제로 작동해야합니다.

 // type is CTech 
     // propertyPath in that case is "name" 
     FieldInfo info = type.GetField(propertyPath, BindingFlags.Instance 
         | BindingFlags.Public | BindingFlags.NonPublic); 

내가 뭘 잘못하고 있니?

고유 한 CustomInspector가있는 관리되는 라이브러리에서이 메서드를 호출하려고합니다. 그래서 그것은 모든 분야에 반영하고 그것을 어떻게 표시해야 하는지를 보여줍니다. AppDomain은 완전히 신뢰할 수 있습니다. 나는 그 밖에 무엇이 중요 할 수 있는지 모른다 ...

+6

변수'type'은'typeof (_SerializableType)'입니까? –

+1

@AntonKomyshan이 말한 것에 덧붙여, 변수'propertyPath'는 문자열 "name"이어야합니다? –

+0

@AntonKomyshan 옙 타입이 _SerializeType입니다 (seriliazedObject의 Iterator를 통해 얻었습니다) 더 복잡하다고 말했습니다. SteveDanner보다 더 넣었습니다 ... –

답변

6

기본 클래스에서 파생 된 유형으로 선언 된 비공개 필드를 얻는 유일한 방법은 클래스 계층을 올라가는 것이다. 그래서 예를 들어, 다음과 같은 일을 할 수있는 :

당신은 당신의 객체가 실제로 원하는 유형이 있는지 확인하고 올바른 형식 개체에 GetField 전화를해야
public FieldInfo GetPrivateFieldRecursive(Type type, string fieldName) 
{ 
    FieldInfo field = null; 

    do 
    { 
     field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public 
      | BindingFlags.NonPublic | BindingFlags.GetField); 
     type = type.BaseType; 

    } while(field == null && type != null); 

    return field; 
} 
3

.

+0

헤이 챔피언이 필요합니다. 답을 고맙습니다. 그러나 나는 @DavidG의 답처럼 더 유연한 것을 필요로한다. 왜냐하면 : _이 메서드는 자체 CustomInspector가있는 관리되는 라이브러리에서 호출하기 때문입니다. 그래서 그것은 모든 분야에 반영하고 그것을 어떻게 보여줄지를 보여줍니다 ._ –

관련 문제