powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / typeof и обратно
14 сообщений из 14, страница 1 из 1
typeof и обратно
    #37096281
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется коллекция элементов List<Type>, необходимо пробежаться по всем элементам коллекции и вызвать статический метод определенный в каждом типе.
Задача сводится к тому, чтобы получить тип из переменной типа Type.
Подскажите как это сделать?

Смотрел на msdn, там показано как добраться до метода объекта, а как вызвать статический метод нигде не описано.
...
Рейтинг: 0 / 0
typeof и обратно
    #37096333
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xpoft2010,

дайте больше информации.

у вас так понимаю некое уникальное не типизированное хранилище, в который входят некие классы со своими методами и свойствами?
...
Рейтинг: 0 / 0
typeof и обратно
    #37096374
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xpoft2010,

только что был на форумах silverlight.net, читая один из тредов пришла идея.

почему бы не заменить List<Type> на List<Object> тогда с помощью рефлектора можно будет вытащить тип класса объекта и кастовать в нужный класс (а там уже делать все что необходимо) ?
...
Рейтинг: 0 / 0
typeof и обратно
    #37096414
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
var ts = new List<Type>();
foreach(var t in ts)
{
      if (t == typeof(Class1))
             Class1.StaticMethod1();
      else if (t == typeof(Class2))
             Class2.StaticMethod2();
}
...
Рейтинг: 0 / 0
typeof и обратно
    #37096415
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то типа InvokeMember("MethodName", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, ...
для дженерика - http://blogs.microsoft.co.il/blogs/bursteg/archive/2006/11/15/InvokeStaticGenericMethod.aspx
...
Рейтинг: 0 / 0
typeof и обратно
    #37096508
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще можно так:
Код: plaintext
1.
2.
3.
            List<Type> ts = new List<Type>();
            List<Tuple<Type, Delegate>> methods = new List<Tuple<Type,Delegate>>(10);
            ts.Join(methods, t => t, m => m.Item1, (t, m) => m.Item2.DynamicInvoke());

в methods складывайте пару (тип, метод_который_надо_запустить)
...
Рейтинг: 0 / 0
typeof и обратно
    #37096509
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Run() забыл...
...
Рейтинг: 0 / 0
typeof и обратно
    #37097301
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уТКаxpoft2010,

дайте больше информации.

у вас так понимаю некое уникальное не типизированное хранилище, в который входят некие классы со своими методами и свойствами?

При запуске приложения создается коллекция классов которые имеют в себе статический метод
Код: plaintext
1.
2.
3.
4.
    public partial class App : Application
    {
        public static List<Type> SecurityTypes = new List<Type>() { typeof(SecurityTest) };
    }  

Затем мне нужно получить данные которые возвращает этот статический метод класса.

уТКатолько что был на форумах silverlight.net, читая один из тредов пришла идея.

почему бы не заменить List<Type> на List<Object> тогда с помощью рефлектора можно будет вытащить тип класса объекта и кастовать в нужный класс (а там уже делать все что необходимо) ?


Я так понимаю в этом случае в коллекцию нужно будет давать ссылку на объект, а создавать его не хотелось бы, это просто ненужно, поэтому и был выбран статический метод для использования.
...
Рейтинг: 0 / 0
typeof и обратно
    #37097307
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лень логиниться
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
var ts = new List<Type>();
foreach(var t in ts)
{
      if (t == typeof(Class1))
             Class1.StaticMethod1();
      else if (t == typeof(Class2))
             Class2.StaticMethod2();
}


Перебирать все классы, которых будет довольно много, не эстетично это :)
...
Рейтинг: 0 / 0
typeof и обратно
    #37097379
xpoft2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LRчто-то типа InvokeMember("MethodName", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, ...
для дженерика - http://blogs.microsoft.co.il/blogs/bursteg/archive/2006/11/15/InvokeStaticGenericMethod.aspx

Сделал как описано в статье, отлично работает, спасибо! :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
private void SecuritySettings_Loaded(object sender, RoutedEventArgs e)
        {
            //Получим из App список наших классов
            this.listBox1.ItemsSource = App.SecurityTypes;

            foreach (Type type in App.SecurityTypes)
            {   
                // Grabbing the specific static method
                MethodInfo methodInfo = type.GetMethod("GetSecurityInfoList", System.Reflection.BindingFlags.Static | BindingFlags.Public);

                // Binding the method info to generic arguments
                //Type[] genericArguments = new Type[] { };
                //MethodInfo genericMethodInfo = methodInfo.GetBaseDefinition();

                // Simply invoking the method and passing parameters
                // The null parameter is the object to call the method from. Since the method is
                // static, pass null.
                object returnValue = methodInfo.Invoke(null, new object[] { });

                this.listBox2.ItemsSource = (List<SecurityInfo>)returnValue;
            }
        }

получаем коллекцию необходимых элементов, дальше уже дело техники =)
...
Рейтинг: 0 / 0
typeof и обратно
    #37097485
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а я б "укомпактил" в одну строку, типа
var x = App.SecurityTypes.Select(t => t.InvokeMember("GetSecurityInfoList", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, null, new object[] { }) as List<List<SecurityInfo>>);

:)
...
Рейтинг: 0 / 0
typeof и обратно
    #37097514
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока это только запрос. его надо выполнить
через .Run(), например (если стоит Rx), или .Sum(a => 0);
...
Рейтинг: 0 / 0
typeof и обратно
    #37097536
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
this.listBox2.ItemsSource = (List<SecurityInfo>)returnValue;
не совсем понятно. вы все биндите на один и тот же листбокс. у вас там останется только результат самого последнего вызова
...
Рейтинг: 0 / 0
typeof и обратно
    #37097552
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опечатка...
var x = App.SecurityTypes.Select(t => t.InvokeMember("GetSecurityInfoList", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, null, new object[] { }) as List<List<SecurityInfo>>);

кстати, код непонятен
Код: plaintext
1.
2.
3.
4.
foreach (Type type in App.SecurityTypes)
            {   
...
this.listBox2.ItemsSource = (List<SecurityInfo>)returnValue;
вероятно "черновик исследования"))

а вот предложение Вестника в чем-то более универсально, например, если методы "разношерстные"
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / typeof и обратно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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