首先,我参与了这些主题:
Is it possible to get a property's private setter through reflection?
Is it possible to set private property via reflection?
Is it possible to set private property via reflection?
尽管是问题的解决方案,但是甚至更多但没有工作。我有:
public class Component : EngineObject
public GameObject gameObject { get; private set; }
public Transform transform {get; private set;}
internal void SetComponentReference<T>(T reference)where T :EngineObject
{
if (reference == null)
{
return;
}
try
{
PropertyInfo[] info = this.GetType().GetProperties();
Type type = reference.GetType();
foreach (var prop in info)
{
Type propType = prop.PropertyType;
if (propType == typeof(T))
{
prop.SetValue(this, reference);
break;
}
}
}catch(Exception e)
{
System.Diagnostics.Debug.Write(e.Message);
}
}
}
我总是得到ArgumentException,找不到属性集方法。但是,如果我将setter设置为public,那就很好并设置我的属性。它与参数无关,因为在调用之前有检查。我也尝试过使用BindingFlags,如许多线程所示,但到目前为止都没有。
编辑:所以这发生在Component类中,SetComponentReference是在创建时从GameObject类调用的。因此,在创建新的GameObject时,还会自动添加Transform,该方法的要点是将gameObject属性和其他属性设置为实际对象。 setter不能公开,因为它允许用户在被禁止时修改它们,或者附加到特定GO的组件可以被赋予新的GO引用,同时仍然处理旧的引用。EngineObject约束是因为引擎中的所有对象都继承自该类。
答案 0 :(得分:0)
您可以使用反射来调用私有setter,您只需使用带有显式反射绑定标志的方法。