Как идентифицировать EventCallback с помощью отраженияC#

Место общения программистов C#
Ответить
Anonymous
 Как идентифицировать EventCallback с помощью отражения

Сообщение Anonymous »

Настройка
У меня есть интерфейс с несколькими EventCallbacks, некоторые из которых являются универсальными.
Я использую System.Reflection.GetProperties() для просмотра всех свойств интерфейса
Сейчас я использую что-то вроде ProcessEventCallbacks ниже, чтобы определить, является ли свойство EventCallback, EventCallback или нет, и что мне не нравится, так это то, что я выполняю сравнение строк, чтобы получить ответ.
Вопрос

Есть ли способ определить, является ли propInfo.PropertyType EventCallback или EventCallback без использования сравнения строк?

Что я пробовал
  • Я посмотрел на propInfo и просмотрел объект в поисках ответа.
  • Изучил EventCallback и EventCallback в документации Microsoft.
  • Поиск в Интернете.
    < li>Сравнение типов
  • propInfo.PropertyType == typeof(EventCallback)
  • propInfo.PropertyType == typeof(EventCallback)

    Проблема заключается в том, что существует множество универсальных типов и множество универсальных EventCallbacks, и я бы предпочел не писать случай для каждого универсального типа.

public interface ICustomList where TItem : class
{
public TItem Item { get; set; }
public EventCallback OnListUpdated { get; set; }
public EventCallback OnItemAdded { get; set; }
}

public class CustomList : ICustomList
where TItem : class
{
protected void ProcessEventCallbacks()
{
Type iType = typeof(ICustomList);
PropertyInfo[] iPropertyInfo = iType.GetProperties();

Array.ForEach(iPropertyInfo, propInfo =>
{
string propName = propInfo.PropertyType.Name;

if (propName.Contains('EventCallback')
{
// Do some processing...

/******************************************************
These are the possible values in this situation
propName == 'EventCallback`1'
propName == 'EventCallback'
******************************************************/
}
});
}
}

Решение
Спасибо @madreflection
protected void ProcessEventCallbacks()
{
Type iType = typeof(ICustomList);

PropertyInfo[] iProps = iType.GetProperties();

iProps.Where(prop =>
prop.PropertyType == typeof(EventCallback)
||
(
prop.PropertyType.IsGenericType
&&
prop.PropertyType.GetGenericTypeDefinition() ==
typeof(EventCallback)
)
).ToList().ForEach(propInfo =>
{
Console.WriteLine($"Answer: {propInfo.Name} is {propInfo.PropertyType.Name}");
});
}

Выводится:
Answer: OnDone is EventCallback
Answer: ItemChanged is EventCallback`1
Answer: EditingChanged is EventCallback`1
Answer: CanSaveChanged is EventCallback`1
Answer: OnConfirmSave is EventCallback`1
Answer: OnConfirmRemove is EventCallback`1
Answer: OnCreate is EventCallback`1
Answer: OnUpdate is EventCallback`1
Answer: OnRemove is EventCallback`1
Answer: OnSave is EventCallback`1
Answer: OnCancel is EventCallback`1
Answer: OnBeginEditing is EventCallback`1


Подробнее здесь: https://stackoverflow.com/questions/781 ... reflection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»