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

本文关键字:添加 对象 属性 动态 | 更新日期: 2023-09-27 18:07:53

我有一个类FooBar。我在所有代码库中都使用这个类,并希望保持它的整洁。我目前正在以这样一种方式使用FooBar,我有一个FooBar列表和一个值列表。我需要迭代列表并将值匹配到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

现在我只是创建一个新的字典>。创建一个字典只是正确的方式来做到这一点,或者我可以做一些类似于我上面发布的?

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

您可以使用ExpandoObject,它实际上只不过是一个Dictionary<string, object>

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

当然,使用一个临时的Dictionary<FooBar, List<int>>是很容易的。

有几个选项,这取决于您需要什么。Dictionary<FooBar, List<int>>Dictionary<FooBar, HashSet<int>>均可。

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

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

也许您应该创建自己的类,派生自所建议的类型之一,以使您的整体代码更精简。

不能,你不能动态地给对象添加属性。我不能告诉你,你目前拥有的是否是最好的方法,因为我不知道你想要做什么。如果您能说明在哪里以及如何使用这些代码,我可以给出一个更好的答案。

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

如果你有一个在你的代码库中使用的类,你需要将它匹配到一个值列表,但它缺乏保存这些值的能力,你应该重新考虑你的设计。根据你获得这些值的位置,你可能想要获得FooBar的特定实例的引用,或者考虑从FooBar继承或保存这些值的类,然后从FooBar实例获得id属性。