Метод отражения и растяжения - PullRequest
1 голос
/ 19 декабря 2011

У меня есть метод расширения для класса строки

public static bool Contains(this string original, string value, StringComparison comparisionType)
{
   return original.IndexOf(value, comparisionType) >= 0;
}

Но невозможно получить метод путем отражения

IEnumerable<MethodInfo> foundMethods = from q in typeof(string).GetMethods()
                                       where q.Name == "Contains"
                                       select q;

foundMethods получает только метод Contains (string), почему? Где другие методы Contains?

Ответы [ 3 ]

3 голосов
/ 19 декабря 2011

Это не метод, объявленный в классе String, поэтому GetMethods не может его увидеть.Тот факт, что метод расширения находится в области видимости, зависит от того, импортировано ли пространство имен, которое его объявляет, и отражение ничего об этом не знает.Имейте в виду, что расширение - это просто статические методы, с синтаксическим сахаром, который делает их похожими на методы экземпляра.

1 голос
/ 19 декабря 2011

Вы не можете использовать простой метод отражения, который вы перечислили в вопросе, чтобы найти методы расширения.

Вам нужно будет посмотреть ExtensionAttribute на классы и методы и убедиться, что первый тип параметра - string . Так как метод расширения может быть определен в любой сборке, вам придется сделать это для интересующих сборок

0 голосов
/ 19 декабря 2011

Ваш метод Contains отсутствует в классе String, поэтому вы не можете получить метод Contains с помощью typeof (string) .GetMethods ().

Чтобы получить то, что вам нужно, вы можете использовать код

public partial String
{
   public static bool Contains(this string original, string value, StringComparison comparisionType)
   {
       return original.IndexOf(value, comparisionType) >= 0;
   } 
}

Но в коде проблема в том, что класс String не может быть статическим, поэтому вы не можете использовать этот параметр.

Таким образом, вы должны определить этот метод Contains в любом статическом классе.

Вы можете получить с помощью кода:

    public static StringDemo
    {
       public static bool Contains(this string original, string value, StringComparison comparisionType)
       {
           return original.IndexOf(value, comparisionType) >= 0;
       } 
    }

IEnumerable<MethodInfo> foundMethods = from q in typeof(StringDemo).GetMethods()
                                       where q.Name == "Contains"
                                   select q;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...