我有一个基本的DTO。它具有Required
属性和ErrorMessage
属性。我正在使用Cecil
来尝试获取ErrorMessage
属性的值,但该属性的值为空。
即
public class FooDto
{
[Required(ErrorMessage = "Cannot be empty")]
public string Bar { get; set;}
}
这是我获取属性的方式:
var myLib = AssemblyDefinition.ReadAssembly(@"C:\lib.dll");
var type = myLib.MainModule.GetType("Namespace.FooDto");
foreach (var prop in type.Properties)
{
foreach (var customattr in prop.CustomAttributes)
{
foreach (var customProp in customattr.Properties)
{
if (customProp.Name == "ErrorMessage")
Console.WriteLine(customProp.Argument.Value.ToString()); // this is always empty string
}
}
}
编辑:如果我使用经典反射,则可以得到ErrorMessage
的值,但是我想使用Cecil,因为我已经在代码中使用库进行了其他操作,并且不希望使用混合方法
答案 0 :(得分:0)
不确定下面的代码与您的方法有何不同,但我可以在控制台中获得“不能为空”输出
var attrs = type.Properties
.SelectMany(p => p.CustomAttributes)
.SelectMany(x => x.Properties)
.Where(x => x.Name == "ErrorMessage")
.Select(x => x.Argument.Value)
.ToArray();
foreach (var attribute in attrs)
Console.WriteLine(attribute);
我用.net 4.5.2和mono 0.10.3进行了测试