У меня есть интерфейс с несколькими 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
Мобильная версия