gpt4 book ai didi

c# - 在 C# 中将对象视为属性字典

转载 作者:可可西里 更新时间:2023-11-01 03:06:55 25 4
gpt4 key购买 nike

我希望能够使用属性名称作为键来访问对象(如字典)中的属性值。我真的不在乎这些值是否作为对象返回,所以 Dictionary<string, object>很好。这是预期用途:

object person = new { Name: "Bob", Age: 45 };
IDictionary<string, object> lookup = new PropertyDictionary(person);
string name = (string)person["Name"];
person["Age"] = (int)person["Age"] + 1; // potentially editable

我正要为此实现我自己的类,但后来我开始注意到像 DynamicObject 这样的类实现了 IDictionary 接口(interface),这让人觉得这已经在某个地方为我完成了。

我想要的类似于 ASP.NET MVC 使用的功能,允许使用匿名类型设置 HTML 标记属性。我有很多使用字典作为数据源的类,但大多数时候我也应该能够传入对象。

因为这是通用的 library ,我想我会创建一个可重用的类,它只是用 IDictionary 接口(interface)装饰一个对象。它将使我免于产生过载爆炸。

最佳答案

我不相信 .Net 框架中已经有这样的内置 .Net 类型。看起来你真的想创建一个行为很像 Javascript 对象的对象。如果是这样,那么从 DynamicObject 派生可能是正确的选择。它允许您创建一个对象,当用 dynamic 包装时,您可以直接绑定(bind) obj.Name 或通过索引器 obj["Name"].

public class PropertyBag : DynamicObject {
private object _source;
public PropertyBag(object source) {
_source = source;
}
public object GetProperty(string name) {
var type = _source.GetType();
var property = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
return property.GetValue(_source, null);
}
public override bool TryGetMember(GetMemberBinder binder, out object result) {
result = GetProperty(binder.Name);
return true;
}
public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) {
result = GetProperty((string)indexes[0]);
return true;
}
}

您可以使用它来包装任何类型并使用索引器和名称语法来获取属性

var student = new Student() { FirstName = "John", LastName = "Doe" };
dynamic bag = new PropertyBag(student);
Console.WriteLine(bag["FirstName"]); // Prints: John
Console.WriteLine(bag.FirstName); // Prints: John

关于c# - 在 C# 中将对象视为属性字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9652560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com