将属性添加到列表或集合中

时间:2015-02-13 10:59:03

标签: c# list generics func

我遇到过一种情况,我可能需要在列表中添加属性(类)以手动调用它们(或者你可以说,我需要分配值(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#中设计它?

1 个答案:

答案 0 :(得分:2)

您可以保留PropertyInfo值列表,然后使用反射设置属性值,也可以保留一个setter委托列表(实际上只是将值转发给真实的隐藏setter)

例如:

IList<Action<object>> listOfSetters;

listOfSetters.Add(o => this.FirstProperty = (int)o);

// and then:
listOfSetters[0](42); // FirstProperty = 42