Как узнать, является ли свойство автореализованным свойством с отражением?

Таким образом в моем случае я делаю открытие структуры класса с помощью отражения. Я должен быть в состоянии узнать, является ли свойство автореализованным свойством объектом PropertyInfo. Я предполагаю, что API Reflection не представляет такой функциональности, потому что автосвойства являются зависимым C#, но там какое-либо обходное решение должно получить эту информацию?

27
задан jason 5 February 2010 в 21:12
поделиться

1 ответ

Вы можете проверить, помечен ли метод get или set с помощью CompilerGenerated атрибут. Затем вы можете объединить это с поиском частного поля, которое помечено атрибутом CompilerGenerated , содержащим имя свойства и строку «BackingField» .

Возможно:

public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
    this PropertyInfo info
) {
    bool mightBe = info.GetGetMethod()
                       .GetCustomAttributes(
                           typeof(CompilerGeneratedAttribute),
                           true
                       )
                       .Any();
    if (!mightBe) {
        return false;
    }


    bool maybe = info.DeclaringType
                     .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                     .Where(f => f.Name.Contains(info.Name))
                     .Where(f => f.Name.Contains("BackingField"))
                     .Where(
                         f => f.GetCustomAttributes(
                             typeof(CompilerGeneratedAttribute),
                             true
                         ).Any()
                     )
                     .Any();

        return maybe;
    }

Это не защита от дурака, довольно хрупкая и, вероятно, не переносимая, скажем, на Mono.

24
ответ дан 28 November 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: