你能在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
现在我只是创建一个新的字典
您可以使用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
属性。