C# Reflection. Abstract objects.

User avatar
wolfboy
Уже с Приветом
Posts: 1224
Joined: 24 Feb 2003 07:40

C# Reflection. Abstract objects.

Post by wolfboy »

1. Как для введенного типа определить, является ли он интерфейсом?
2. Как для введенного метода определить, является ли он abstract method или delegate?
Спасибо.
lozzy
Уже с Приветом
Posts: 2435
Joined: 12 Jun 2001 09:01

Re: C# Reflection. Abstract objects.

Post by lozzy »

wolfboy wrote:1. Как для введенного типа определить, является ли он интерфейсом?
2. Как для введенного метода определить, является ли он abstract method или delegate?
Спасибо.


1. if (SomeObject is IMyInterface) { blablabla; }
2. MSDN :

Code: Select all

public abstract class MyAbstractClass 
{
}

public class MyClass
{
}

public class Type_IsAbstract
{
   public static void Main()
   {
      try
      {
         Console.WriteLine("\nChecking whether the type is abstract\n");

         // Check whether the return Type is abstract or not.
         Console.WriteLine("'MyAbstractClass' is {0}",
            ([b]typeof(MyAbstractClass).IsAbstract[/b]) ?
            "an abstract class" :
            "not an abstract class" );

         // Check whether the return Type is abstract or not.
         Console.WriteLine("'MyClass' is {0}",
            (typeof(MyClass).IsAbstract) ?
            "an abstract class" :
            "not an abstract class" );
         
      }
      catch( Exception e )
      {
         Console.WriteLine( "Exception: {0} \n", e.Message );
      }
   }
}


Насчет делегатов - не думаю, что все так просто, ибо делегат это как бы функция с предопределенной сигнатурой. На стадии компиляции они заменяются на вызовы (ИМХО).
Steel helmet protects your teeth from the morning to the evening.
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Re: C# Reflection. Abstract objects.

Post by Gennadiy »

wolfboy wrote:1. Как для введенного типа определить, является ли он интерфейсом?

Type.IsInterface (или someReference.GetType().IsInterface)
2. Как для введенного метода определить, является ли он abstract method или delegate?
Спасибо.

Type.IsAbstract
Type.IsSubcalssOf(typeof(MulticastDelegate))
User avatar
wolfboy
Уже с Приветом
Posts: 1224
Joined: 24 Feb 2003 07:40

Post by wolfboy »

Спасибо.
Но родились еще вопрос
1.Есть тип type и принадлежащий ему метод method
хочу вызвать
type.GetMethod(method.name,TypeOfMethodParameter[]),
где TypeOfMethodParameter[] - массив типов параметров метода method.
Как получить ентот массив?
Спасибо.
Last edited by wolfboy on 28 Mar 2004 06:39, edited 2 times in total.
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

Тут два вопроса. Первое - получить описание метода MethodInfo.
Для чего вы вызываете Type.GetMethod. В принципе можно передать только имя метода Type.GetMethod("MyMethod"). Это самый распостраненный вариант.
Передавать типы параметров нужно только если вы подозреваете, что метод может быть overloaded. Например в классе есть MyMethod(string) и MyMethod(int, object). В этом случае вызвав Type.GetMethod("MyMethod", new Type[]{typeof(int), typeof(object)}) вы гарантируете, что получите второй из методов.
Если вы подозревете что методов с этим именем несколько и НЕ знаете заранее какие параметры в них, то вызывайте Type.GetMethods() итерируйте через все методы и выбирайте нужный.
Второй вопрос. Вызов метода. Тут вам уже обязательно надо знать параметры. Если не знаете, то вызывайте MethodInfo.GetParameters() и исследуйте полученый список (MethodInfo вам вернул GetMethod). И используйте это знание в вызове MethodInfo.Invoke
User avatar
wolfboy
Уже с Приветом
Posts: 1224
Joined: 24 Feb 2003 07:40

Post by wolfboy »

Да, нужно получить описание метода MethodInfo для overloaded methods. Предложеный вами вариант с вызовом GetMethods в принципе подходит, но он имеет одну неприятность: если мне нужны все методы в типе, то для каждого ентого метода нужно итерировать по всем и эффективность программы сильно упадет.
Может нужно копать в сторону ParameterInfo[]? Нельзя ли из него получить
Type[] parameterTypes?
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

wolfboy wrote:Да, нужно получить описание метода MethodInfo для overloaded methods. Предложеный вами вариант с вызовом GetMethods в принципе подходит, но он имеет одну неприятность: если мне нужны все методы в типе, то для каждого ентого метода нужно итерировать по всем и эффективность программы сильно упадет.
Может нужно копать в сторону ParameterInfo[]? Нельзя ли из него получить
Type[] parameterTypes?


Сделайте хештаблицу и запоминайте эту инфу, таким образом рефлекшн будет вызыватся только один раз для каждого типа.
Рефлекшн сам по себе медленный, его результаты обычно кешируются
Никакой разрухи нет. (с) Проф. Преображенский.

Return to “Вопросы и новости IT”