Значение пользовательского атрибута Cecil пусто - PullRequest
0 голосов
/ 18 марта 2019

У меня есть базовый 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, но я хочу использовать Сесил, потому что я уже делаю другие вещи с библиотекой в ​​моем коде и нене хочу гибридного подхода.

1 Ответ

0 голосов
/ 18 марта 2019

Не уверен, что приведенный ниже код отличается от вашего подхода, но я могу получить вывод "Cannot be empty" в консоли

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

...