如何在不使用反射的情况下创建通用属性访问器?
我想创建一个通用属性访问器类,以便能够将属性对象传递给它,然后访问该属性值;获取和设置。
我不喜欢仅将反射与 Func 和 Action 以及 lambda 表达式一起使用。
下面代码的问题是它会复制属性值并将其传递过来,因此它实际上不会发送属性引用,而我希望能够使用获取和设置 Product 对象的 Number 属性GenericPropertyAccessor 类。
static void Main(string[] args)
{
var product = new Product {Number = 1};
var productNumberAccesstor = new GenericPropertyAccessor<int>(product.Number);
productNumberAccesstor.Value = 23;
Console.WriteLine(productNumberAccesstor.Value);
Console.ReadLine();
}
}
public class Product
{
public int Number { get; set; }
public string Name { get; set; }
}
public class GenericPropertyAccessor<T>
{
private T _property;
public GenericPropertyAccessor(T propertyExpression)
{
_property = propertyExpression;
}
public T Value
{
get
{
return Get(() => _property);
}
set
{
Set(valueInput => _property = valueInput , value);
}
}
static T Get(Func<T> getFunc)
{
return getFunc();
}
static void Set(Action<T> setAction, T value)
{
setAction(value);
}
}
基本上,我应该将什么传递给 GenericPropertyAccessor 的构造函数来启用它?
我知道一种解决方案如下,但是否有可能进一步简化呢?特别是在 GenericPropertyAccessor 的构造函数上。是否可以将 lambda 表达式移动到类中并且只传递一种属性引用。
class Program
{
static void Main(string[] args)
{
var product = new Product {Number = 1};
var productNumberAccesstor = new GenericPropertyAccessor<int>(() => product.Number, value => product.Number = value);
productNumberAccesstor.Value = 23;
Console.WriteLine(productNumberAccesstor.Value);
Console.ReadLine();
}
}
public class Product
{
public int Number { get; set; }
}
public class GenericPropertyAccessor<T>
{
private readonly Func<T> _getFunc;
private readonly Action<T> _setAction;
public GenericPropertyAccessor(Func<T> getFunc, Action<T> setAction)
{
_getFunc = getFunc;
_setAction = setAction;
}
public T Value
{
get
{
return _getFunc();
}
set
{
_setAction(value);
}
}
}
我的意思是如何在类中传递“product.Number”表达式?