将属性添加到列表或集合中
Adding Properties into a List or Collection
我遇到过这样一种情况,我可能需要在列表中添加属性(class)以手动调用它们(或者你可以说,我需要在那里分配值(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
Properties can be used as if they are public data members, but they
are actually special methods called accessors.
如果属性是内部方法,为什么它们不能添加为 List of Func<>
此外,如果不使用反射(通过获取 PropertyInfo 列表)我无法做到这一点,为什么 Microsoft 没有在 C# 中设计它?
您可以保留 PropertyInfo
个值的列表,然后使用反射设置属性的值,或者您可以保留 setter 个委托的列表(实际上只是将值转发给真实的,隐藏的 setter).
例如:
IList<Action<object>> listOfSetters;
listOfSetters.Add(o => this.FirstProperty = (int)o);
// and then:
listOfSetters[0](42); // FirstProperty = 42
我遇到过这样一种情况,我可能需要在列表中添加属性(class)以手动调用它们(或者你可以说,我需要在那里分配值(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
Properties can be used as if they are public data members, but they are actually special methods called accessors.
如果属性是内部方法,为什么它们不能添加为 List of Func<>
此外,如果不使用反射(通过获取 PropertyInfo 列表)我无法做到这一点,为什么 Microsoft 没有在 C# 中设计它?
您可以保留 PropertyInfo
个值的列表,然后使用反射设置属性的值,或者您可以保留 setter 个委托的列表(实际上只是将值转发给真实的,隐藏的 setter).
例如:
IList<Action<object>> listOfSetters;
listOfSetters.Add(o => this.FirstProperty = (int)o);
// and then:
listOfSetters[0](42); // FirstProperty = 42