你能动态地在C#中向对象添加属性吗?

时间:2014-06-10 15:07:43

标签: c#

我有一个类FooBar。我在我的代码库中使用这个类,并希望保持干净。我目前正在使用FooBar这样一种方式,我有一个FooBars列表和一个值列表。我需要遍历列表并将值与FooBar元素匹配。将有多个值与单个FooBar相关联。有什么方法我可以临时添加一个列表到我的FooBar对象,所以我可以将值附加到此列表?像这样:

List <FooBar> myFoos = GetFoos();
List <int> values = GetValues();
foreach (var value in values)
{
    foreach (var foo in myFoos)
    {
        if (CheckMatch(foo, value))
        {
            if (foo.tempList == null)
            {
                foo.tempList = new List<int>();
            }
            foo.tempList.Add(value);
        }
    }
}
//...
//do things with the list of values on each FooBar

现在我只是创建一个新的&lt;词典。 FooBar,List&lt; int&gt;&gt;。创建一个Dictionary是正确的方法,或者我可以做一些类似于我上面发布的内容吗?

4 个答案:

答案 0 :(得分:2)

你可以使用ExpandoObject,实际上只有Dictionary<string, object>

dynamic instance = new ExpandoObject();
instance.tempList = new List<int>();

instance.tempList.Add(1);

当然,使用临时Dictionary<FooBar, List<int>>就是这么简单。

答案 1 :(得分:1)

根据您的需要,有多种选择。可以使用Dictionary<FooBar, List<int>>Dictionary<FooBar, HashSet<int>>

或者您可以使用HashSet<KeyValuePair<FooBar, int>>

这完全取决于您需要的约束类型。

也许您应该创建自己的类,从一个建议的类型派生,以使您的整体代码更苗条。

答案 2 :(得分:0)

不,您无法动态地向对象添加属性。我不能告诉你,你现在拥有的是最好的方法,因为我不知道你要做什么。如果您能够了解使用此代码的位置和方式,我可以给出更好的答案。

答案 3 :(得分:0)

如果您需要by using Reflection,可以创建动态属性,但这可能不一定是解决问题的最佳方法。

如果您的代码库中使用了一个类,并且您需要将它与值列表匹配,但它缺乏保存这些值的能力,那么您应该重新考虑您的设计。根据您获取这些值的位置,您可能希望获得对FooBar的特定实例的引用,或者考虑从FooBar继承或保存这些值的类,然后从中获取id属性FooBar实例。

相关问题