私人二传手上的SetValue

时间:2014-10-16 07:57:43

标签: c# reflection properties setter

首先,我参与了这些主题:

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约束是因为引擎中的所有对象都继承自该类。

1 个答案:

答案 0 :(得分:0)

您可以使用反射来调用私有setter,您只需使用带有显式反射绑定标志的方法。