Cecil自定义属性值为空

时间:2019-03-18 01:26:48

标签: c# .net-core mono.cecil

我有一个基本的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,因为我已经在代码中使用库进行了其他操作,并且不希望使用混合方法

1 个答案:

答案 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进行了测试