Определить, является ли метод «внешним», используя отражение

#c# #reflection

#c# #отражение

Вопрос:

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

Пример метода:

 var mEnter = typeof(System.Threading.Monitor).GetMethod("Exit", BindingFlags.Static | BindingFlags.Public);
 

Комментарии:

1. Взгляните на MethodImplAttributes перечисление по адресу MethodInfo.MethodImplementationFlags .

Ответ №1:

 var isExtern = (mEnter.MethodImplementationFlags
                    amp; MethodImplAttributes.InternalCall) != 0;
 

Комментарии:

1. Он отлично работает для этого метода, но не для потоковой передачи. Взаимосвязанный общедоступный статический внешний объект CompareExchange (ссылка на местоположение объекта1, значение объекта, объект сравнения); Я обновлю свой вопрос

2. @animaonline отлично работает и для этого: var method = typeof(System.Threading.Interlocked).GetMethod("CompareExchange", new[] { typeof(object).MakeByRefType(), typeof(object), typeof(object) });

3. Если вы используете DllImportAttribute , то метод будет отмечен PreserveSig .

4. Но, конечно! Этот метод был общим и не был помечен как extern 🙂 Спасибо за ваш ответ!

5.@animaonline действительно, существует и общая версия, которая не является extern

Ответ №2:

Я не знаю, есть ли какой-либо прямой способ выяснить, но я могу показать трюк, который я использовал, Предположим, у нас есть класс, содержащий метод extern

 class MyClass
{
    [DllImport("kernel32.dll")]
    public static extern bool Beep(int ferequency, int duration);
    public static void gr()
    {
    }
    public void GG()
    {
    }
}
 

мы можем получить метод проверки внешнего, написав этот код

  var t = typeof(MyClass);
        var l = t.GetMethods();
        foreach (var item in l)
        {
            if (item.GetMethodBody() == null amp;amp; item.IsStatic)
            {
                // Method is Extern
            }
        }