我正在开发一个文档生成器。MSDN文档显示了应用时传递给Attributes的参数。如CCD_ 1。我将如何通过反射、pdb文件或其他方式获得c代码中调用的那些参数值和/或构造函数?
澄清>如果有人记录了一个方法,上面有这样的属性:
/// <summary> foo does bar </summary>
[SomeCustomAttribute("a supplied value")]
void Foo() {
DoBar();
}
我希望能够在我的文档中显示该方法的签名,如下所示:
Signature:
[SomeCustomAttribute("a supplied value")]
void Foo();
如果您有一个成员想要获得其自定义属性和构造函数参数,则可以使用以下反射代码:
MemberInfo member; // <-- Get a member
var customAttributes = member.GetCustomAttributesData();
foreach (var data in customAttributes)
{
// The type of the attribute,
// e.g. "SomeCustomAttribute"
Console.WriteLine(data.AttributeType);
foreach (var arg in data.ConstructorArguments)
{
// The type and value of the constructor arguments,
// e.g. "System.String a supplied value"
Console.WriteLine(arg.ArgumentType + " " + arg.Value);
}
}
要获取成员,请从获取类型开始。有两种方法可以获得类型。
- 如果您有一个实例
obj
,请调用Type type = obj.GetType();
- 如果类型名称为
MyType
,请执行Type type = typeof(MyType);
然后你可以找到,例如,一个特定的方法。查看反射文档以获取更多信息。
MemberInfo member = typeof(MyType).GetMethod("Foo");
对于ComVisibileAttribute
,传递给构造函数的参数变为Value
属性。
[ComVisibleAttribute(true)]
public class MyClass { ... }
...
Type classType = typeof(MyClass);
object[] attrs = classType.GetCustomAttributes(true);
foreach (object attr in attrs)
{
ComVisibleAttribute comVisible = attr as ComVisibleAttribute;
if (comVisible != null)
{
return comVisible.Value // returns true
}
}
其他属性将遵循类似的设计模式。
编辑
我发现了这篇关于Mono的文章。Cecil描述了如何做一些非常相似的事情。看起来它应该做你需要的事。
foreach (CustomAttribute eca in classType.CustomAttributes)
{
Console.WriteLine("[{0}({1})]", eca, eca.ConstructorParameters.Join(", "));
}