我遇到过一种情况,我可能需要在列表中添加属性(类)以手动调用它们(或者你可以说,我需要分配值(setter))。这就是为什么因为,我甚至不知道哪些属性是设置值,但它们是在运行时决定的。到目前为止,我试图在这里和那里找到解决方案,但我仍然没有得到任何文章,甚至暗示我为此目的的工作。 这就是我想要做的事情(作为评论提到) -
public class DemoClass
{
IList<Properties> _listOfProps;
private int _iFirstProperty;
private string _iSecondProperty;
public DemoClass()
{
_listOfProps = new List<Properties>();
}
public int FirstProperty
{
get
{
return _iFirstProperty;
}
set
{
_iFirstProperty = value;
// Here I want to add this property into the list.
_listOfProps.Add(FirstProperty);
RaisePropertyChanged("FirstProperty");
}
}
public string SecondProperty
{
get
{
return _iSecondProperty;
}
set
{
_iSecondProperty = value;
RaisePropertyChanged("SecondProperty");
}
}
public void HandleChangedProperties()
{
foreach (var list in _listOfProps)
{
// Here I want to invoke the property. ie. sets the 'value' of this property.
list.Invoke(value)
}
}
}
我知道,我可以使用Func在列表中添加 - 但我不能用它。
List<Func<int>> listOfFunc = new List<Func<int>>();
listOfFunc.Add(() => { return 0; }); // Adds using lambda expression
listOfFunc.Add(temp); // Adds as a delegate invoker
private int temp()
{
return 0;
}
来自MSDN
属性可以像它们是公共数据成员一样使用,但它们可以使用 实际上是称为访问者的特殊方法。
如果属性是内部方法,为什么不能将它们添加为 Func的列表&lt;&gt;
另外,如果没有使用Reflection(通过获取PropertyInfo列表)我无法做到这一点,为什么Microsoft没有在C#中设计它?
答案 0 :(得分:2)
您可以保留PropertyInfo
值列表,然后使用反射设置属性值,也可以保留一个setter委托列表(实际上只是将值转发给真实的隐藏setter)
例如:
IList<Action<object>> listOfSetters;
listOfSetters.Add(o => this.FirstProperty = (int)o);
// and then:
listOfSetters[0](42); // FirstProperty = 42