我有一个具有一组属性的类。我想要做的是在运行时动态添加将在调用属性设置器时运行的自定义代码行。
有没有办法实现这个目标?或者至少是一种创建代理类的方法,它将以实体框架和模拟框架的方式包装原始类?
答案 0 :(得分:1)
我建议不要动态地将行为添加到您未编写的类中。这违反了Open-Closed Principle,其中声明:
软件实体(类,模块,函数等)应该是开放的 用于扩展,但已关闭以进行修改。
在这种情况下程序在运行之前不知道类结构是什么样的,访问方法/属性的唯一选择是(如你所建议的)包装原始类并使用Reflection来访问类成员。 / p>
这是一个(未经测试的)使用 Reflection 来访问对象属性的包装类的示例:
using System;
using System.Reflection;
public class ProxyClass
{
public Type WrappedType { get; private set; }
public Object WrappedObject { get; private set; }
public ProxyClass(Object wrappedObject)
{
WrappedObject = wrappedObject;
WrappedType = wrappedObject.GetType();
} // end constructor
public object GetPropVal(String propName)
{
return WrappedType.GetProperty(propName).GetValue(WrappedObject, null);
} // end GetPropVal
public void SetPropVal(String propName, Object val)
{
WrappedType.GetProperty(propName).SetValue(WrappedObject, val, null);
} // end SetPropVal
} // end class ProxyClass
有关进一步阅读,请查看Type.GetProperties方法的文档 - 这将有助于确定您尝试包装的对象上是否存在某个属性。