C#无法反映到私有领域
C# Can't reflect into private field
我遇到了问题。
在Unity中我想反映到一个私有领域。但是对于字段信息,我总是得到 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 是完全受信任的。我不知道还有什么重要的...
从派生类型获取在基 class 中声明的私有字段的唯一方法是向上 class 层次结构。例如,您可以这样做:
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;
}
您必须确保您的对象实际上是所需的类型,然后在正确的类型对象上调用 GetField
。
using System;
using System.Reflection;
public class Program
{
public static void Main()
{
var obj = new SerializableType();
// reflection version of "obj is _SerializableType":
if(typeof(_SerializableType).IsAssignableFrom(obj.GetType()))
{
var info = typeof(_SerializableType).GetField("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var name = info.GetValue(obj);
Console.WriteLine(name);
}
}
}
public abstract class _SerializableType
{
public string name = "xyz";
}
public class SerializableType : _SerializableType { }
我遇到了问题。
在Unity中我想反映到一个私有领域。但是对于字段信息,我总是得到 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 是完全受信任的。我不知道还有什么重要的...
从派生类型获取在基 class 中声明的私有字段的唯一方法是向上 class 层次结构。例如,您可以这样做:
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;
}
您必须确保您的对象实际上是所需的类型,然后在正确的类型对象上调用 GetField
。
using System;
using System.Reflection;
public class Program
{
public static void Main()
{
var obj = new SerializableType();
// reflection version of "obj is _SerializableType":
if(typeof(_SerializableType).IsAssignableFrom(obj.GetType()))
{
var info = typeof(_SerializableType).GetField("name", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var name = info.GetValue(obj);
Console.WriteLine(name);
}
}
}
public abstract class _SerializableType
{
public string name = "xyz";
}
public class SerializableType : _SerializableType { }