Как использовать тип в .NET-сборке «черного ящика»? - PullRequest
0 голосов
/ 13 апреля 2010

Я знаю, что сборка .NET является самоописательной из-за метаданных.Теперь предположим, что у меня есть сборка черного ящика, о которой я ничего не знаю.Могу ли я узнать типы, содержащиеся в нем, использовать их методы и передавать аргументы?Как?Фрагменты кода Sampe будут высоко оценены.

[New Edit1]

Я не работаю во время разработки.Я пытаюсь выяснить, сколько аргументов нужно методу типа и каков тип этих аргументов, поэтому я могу вызвать метод во время выполнения, используя отражение.

[New Edit2]

Я пришелсо следующими фрагментами кода.Он строит объект из сборки черного ящика.Но это выглядит довольно некрасиво, есть идея получше?

        foreach (ConstructorInfo ci in cis)
        {
            Console.WriteLine("{0}:{1}", ci.MemberType, ci.Name);
            Console.WriteLine("ReflectedType:{0}", ci.ReflectedType);
            ParameterInfo[] parameters = ci.GetParameters();
            Object[] arguments = new Object[parameters.Length];
            Console.WriteLine(parameters.Length);
            for (int i = 0; i < parameters.Length;i++ )
            {
                ParameterInfo para = parameters[i];
                if (para.ParameterType == typeof(Int32))
                {
                    Console.WriteLine("please input a Int32");
                    String input = Console.ReadLine();
                    Int32 para_int32 = Int32.Parse(input);
                    arguments[i] = para_int32;
                }

                if (para.ParameterType == typeof(String))
                {
                    Console.WriteLine("please input a String");
                    String para_String = Console.ReadLine();
                    arguments[i] = para_String;
                }

                //Add all the guesses...
            }
            Object o = ci.Invoke(arguments);

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 13 апреля 2010

Я бы посоветовал вам взглянуть на темы по Отражение , которые позволят вам исследовать метаданные во время выполнения. Конечно, если вас интересует только время разработки, IDE позволит вам изучить связанные пространства имен.

1 голос
/ 13 апреля 2010

Если вы работаете во время разработки, вам, вероятно, стоит взглянуть на Reflector

http://reflector.red -gate.com / download.aspx? TreatAsUpdate = 1

Позволяет просматривать классы / методы / перечисления сборки и т. Д.

0 голосов
/ 13 апреля 2010

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

Предлагаю вам прочитать эту страницу хотя бы.

Пример:

void doSomething(object obj)
{
    Type type = obj.GetType();
    foreach(MemberInfo mi in type.GetMembers())
    {
        //print the data or work on it.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...