powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / И снова раздуплить Reflection
3 сообщений из 3, страница 1 из 1
И снова раздуплить Reflection
    #39744120
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано:
1) Интерфейсы, имеющие кастомные атрибуты, с методами, тоже имеющими кастомные атрибуты.
2) Классы, реализующие эти интерфейсы, и соответственно, ничерта не знающие об этих атрибутах.

В методе, который вызывают все эти методы, я через StackTrace получаю ссылку на MethodBase вызывающего метода и таким образом через DeclaringType.GetInterfaces выхожу на интерфейс известного типа с интересующими меня атрибутами.

А вот как определить, какой метод интерфейса был унаследован вызывающим методом? Одноименных методов с разными наборами параметров в вызывающем классе может быть унаследовано несколько, или даже НЕ унаследовано - они могут быть не описаны в интерфейсе.

В общем, нужно установить однозначную связь между методом класса и методом интерфейса (если он есть в интерфейсе), чтобы выдрать атрибуты из метода интерфейса. Неужели только сравнением наборов параметров?
...
Рейтинг: 0 / 0
И снова раздуплить Reflection
    #39744279
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
    protected MethodInfo GetMethod(Type type, Type inter)
    {
        var map = type.GetInterfaceMap(inter);
        return map.TargetMethods[0]
    }
...
Рейтинг: 0 / 0
И снова раздуплить Reflection
    #39744282
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
class Program
{
  static void Main()
  {
    var barInfo = typeof(Zot).GetMethod("Bar",
      BindingFlags.Instance | BindingFlags.Public, null, new [] {typeof(string), typeof(object[])}, null
    ) ?? throw new ApplicationException("Method Bar notfound");
    foreach (var i in typeof(Zot).GetInterfaces())
    {
      var map = typeof(Zot).GetInterfaceMap(i);
      var index = Array.IndexOf(map.TargetMethods, barInfo);
      if (index==-1) continue;
      var interfaceMethod = map.InterfaceMethods[index];
      Console.WriteLine(((DescriptionAttribute)Attribute.GetCustomAttribute(interfaceMethod,
         typeof(DescriptionAttribute))).Description);
    }
    Console.WriteLine("done");
    Console.ReadKey(true);
  }
}

public interface IFoo
{
  void Bar();
  void Bar(int t);
  void Bar(DateTime dt);

  [Description("huh?")]
  string Bar(string s, params object[] args);
}

public class Foo : IFoo
{
  public virtual void Bar()
  {
    throw new NotImplementedException();
  }

  public virtual void Bar(int t)
  {
    throw new NotImplementedException();
  }

  public virtual void Bar(DateTime dt)
  {
    throw new NotImplementedException();
  }

  public virtual string Bar(string s, params object[] args)
  {
    throw new NotImplementedException();
  }
}

public class Zot : Foo { }
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / И снова раздуплить Reflection
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]