以编程方式向方法或参数添加属性

15

我可以使用TypeDescriptor.AddAttributes在运行时为类型添加属性。如何在方法和参数上执行相同的操作?(也许是两个不同的问题...)


在什么情况下您希望属性出现? - SLaks
对于反射,因此我注意到即使TypeDescriptor.AddAttribute也无法解决这个问题。 - MatteS
2个回答

18

TypeDescriptor.AddAttributes 只对一个非常特定的用例产生影响,即从System.ComponentModel内部。对于反射的其他部分,它并不了解额外属性的信息。而且,System.ComponentModel实际上并不适用于方法或参数。

简而言之,你无法在这里完成添加。你需要将此信息存储在其他地方(自定义),或在编译时添加。


@Mark Gravell,是否有任何解决方法可以在Silverlight项目中添加属性元数据(其中未实现 TypeDescriptorTypeDescriptionProvider)? - Shimmy Weitzhandler
据我所知,没有,@Shimmy。 - Marc Gravell
顺便说一句,@Shimmy - 如果你要标记某个内容为重复,请说明“是什么”的重复(实际上,有一个专门的投票类型可以用于此)。 - Marc Gravell
@MarcGravell,这个是你9分钟前发布的答案的重复内容。 - Shimmy Weitzhandler
@MarcGravell,根据我的问题,首先让我描述一下我的实际情况。我有一个在服务器上实现了IUserUser类。生成的客户端实体实现了IIdentity.IsAuthenticated,我想用[Display(AutoGenerateField=false)]属性来标记它。我尝试在服务器上创建一个匹配的虚拟属性,并将其标记为Exclude,以便它不会被重复生成,然后在元数据主体类中为其添加元数据。应该为客户端上现有的属性生成元数据,但这并没有起作用。生成的IsAuthenticated在客户端上仍然没有被标记。 - Shimmy Weitzhandler

0
从反射器中分析TypeDescriptor类,我发现.AddAttributes方法内部调用了.AddProvider方法。传递给它的TypeDescriptionProvider实例实际上负责提供元数据。您可以尝试向您的类添加[TypeDescriptionProviderAttribute]属性,并通过派生自TypeDescriptionProvider类来实现自己的提供程序。正如文档所说,通过重写TypeDescriptionProvider.CreateInstance,您可以提供一个替代对象,其类型具有所有必要的属性。我怀疑应用于替换类型内部方法的属性也会生效。但是,我自己没有尝试过,所以请随意尝试...

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