动态对象的属性是否可以在运行时添加属性?

12
我希望能在运行时为动态对象/扩展对象的属性添加一个属性,这是否可能?
我想做的是:
dynamic myExpando = new ExpandoObject();
myExpando.SomeProp = "string";
myExpando.AddAttribute("SomeProp", new MyAttribute());

有没有可能以某种方式完成这个任务?


为什么不运行那段代码看看呢? - Sam I am says Reinstate Monica
你有查看过 TypeDescriptor 吗?http://msdn.microsoft.com/zh-cn/library/system.componentmodel.typedescriptor%28v=vs.110%29.aspx - Matthew
@SamIam:我认为他并不指望它能够工作,但是明确一下,不行。它不能工作。结果是这样的:RuntimeBinderException: 'System.Dynamic.ExpandoObject' 不包含 'AddAttribute' 的定义 - recursive
1
如何在运行时向对象添加属性,可能会对你有所帮助。 - Matthew
@user2720372:不是重复问题。那个回答并没有解决属性的问题。 - recursive
1个回答

1
您可以像这样为动态对象添加属性:
 dynamic myExpando = new ExpandoObject();
            myExpando.SomeProp = "string";
            TypeDescriptor.AddAttributes(myExpando, new SerializableAttribute());

要读取属性,您应该使用这个:
 dynamic values = TypeDescriptor.GetAttributes(myExpando);
            for (int i = 0; i < values.Count; i++)
            {
                System.Console.WriteLine(values[i]);
            }

我不确定您是否可以这样读取自定义属性。但是您也可以尝试使用反射:

 System.Reflection.MemberInfo info = myExpando.GetType();
            object[] attributes = info.GetCustomAttributes(true);
            for (int i = 0; i < attributes.Length; i++)
            {
                System.Console.WriteLine(attributes[i]);
            }

然而,使用反射时,您无法看到添加的属性,因为属性是静态元数据。
TypeDescriptor是.NET FCL提供的元数据引擎。您可以在此处阅读文章:

http://blogs.msdn.com/b/parthopdas/archive/2006/01/03/509103.aspx


9
但这是将属性添加到类型而不是属性本身。 - Tomas Jansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接