1. Как для введенного типа определить, является ли он интерфейсом?
2. Как для введенного метода определить, является ли он abstract method или delegate?
Спасибо.
C# Reflection. Abstract objects.
-
- Уже с Приветом
- Posts: 2435
- Joined: 12 Jun 2001 09:01
Re: C# Reflection. Abstract objects.
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.
-
- Уже с Приветом
- Posts: 11332
- Joined: 30 Mar 2000 10:01
- Location: Ice Storm Town
Re: C# Reflection. Abstract objects.
wolfboy wrote:1. Как для введенного типа определить, является ли он интерфейсом?
Type.IsInterface (или someReference.GetType().IsInterface)
2. Как для введенного метода определить, является ли он abstract method или delegate?
Спасибо.
Type.IsAbstract
Type.IsSubcalssOf(typeof(MulticastDelegate))
-
- Уже с Приветом
- Posts: 1224
- Joined: 24 Feb 2003 07:40
Спасибо.
Но родились еще вопрос
1.Есть тип type и принадлежащий ему метод method
хочу вызвать
type.GetMethod(method.name,TypeOfMethodParameter[]),
где TypeOfMethodParameter[] - массив типов параметров метода method.
Как получить ентот массив?
Спасибо.
Но родились еще вопрос
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.
-
- Уже с Приветом
- Posts: 11332
- Joined: 30 Mar 2000 10:01
- Location: Ice Storm Town
Тут два вопроса. Первое - получить описание метода 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
Для чего вы вызываете 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
-
- Уже с Приветом
- Posts: 1224
- Joined: 24 Feb 2003 07:40
Да, нужно получить описание метода MethodInfo для overloaded methods. Предложеный вами вариант с вызовом GetMethods в принципе подходит, но он имеет одну неприятность: если мне нужны все методы в типе, то для каждого ентого метода нужно итерировать по всем и эффективность программы сильно упадет.
Может нужно копать в сторону ParameterInfo[]? Нельзя ли из него получить
Type[] parameterTypes?
Может нужно копать в сторону ParameterInfo[]? Нельзя ли из него получить
Type[] parameterTypes?
-
- Уже с Приветом
- Posts: 569
- Joined: 14 Dec 2003 04:06
- Location: Львов->Киев->Торонто
wolfboy wrote:Да, нужно получить описание метода MethodInfo для overloaded methods. Предложеный вами вариант с вызовом GetMethods в принципе подходит, но он имеет одну неприятность: если мне нужны все методы в типе, то для каждого ентого метода нужно итерировать по всем и эффективность программы сильно упадет.
Может нужно копать в сторону ParameterInfo[]? Нельзя ли из него получить
Type[] parameterTypes?
Сделайте хештаблицу и запоминайте эту инфу, таким образом рефлекшн будет вызыватся только один раз для каждого типа.
Рефлекшн сам по себе медленный, его результаты обычно кешируются
Никакой разрухи нет. (с) Проф. Преображенский.