C # Отражение Как? - PullRequest
       2

C # Отражение Как?

3 голосов
/ 23 сентября 2010

Мне трудно понять рефлексию в C #, поэтому я собираюсь изложить свою конкретную ситуацию и посмотреть, что вы, ребята, можете придумать. Я прочитал здесь тонны вопросов об отражении C #, но я все еще просто не понимаю.

Так вот моя ситуация; Я пытаюсь получить доступ к массиву, который является непубличным членом класса, к которому у меня есть доступ.

alt text

По сути, это System.Collections.CollectionBase , который имеет переменную массива под названием "список", но у него есть этот родительский тип OrderCollection , и его отражение просто запутывает черт побери.

Я должен сделать много таких, чтобы хороший гид или пример действительно помогли. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

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

Ответы [ 2 ]

9 голосов
/ 23 сентября 2010

Что вы пытаетесь использовать отражение вообще?CollectionBase поддерживает индексирование, но только через явную реализацию интерфейса IList, поэтому вы должны иметь возможность написать:

IList list = Acct.Orders;
response = list[0];

Возможно, вам придется привести результат кболее подходящий тип, но я не вижу здесь необходимости в рефлексии.

РЕДАКТИРОВАТЬ: Исходный ответ не учитывал явную реализацию интерфейса.

0 голосов
/ 11 ноября 2016

Хотя это может не помочь вам, но может помочь другим. Вот упрощенный пример отражения:

using System;
using System.Reflection;


namespace TeamActivity
{
    class Program
    {
        static void Main(string[] args)
        {
            // Dynamically load assembly from the provided DLL file.
            Assembly CustomerAssembly = Assembly.LoadFrom( "BasicCalculations.dll" );
            // Get a Type from the Assembly
            Type runtimeType = CustomerAssembly.GetType( "BasicCalcuation.BasicCalc" );
            // Get all methods from the Type.
            MethodInfo[] methods = runtimeType.GetMethods();

            // Loop through all discovered methods.
            foreach ( MethodInfo method in methods )
            {
                Console.WriteLine( "Method name: " + method.Name );
                // Create an array of parameters from this method.
                ParameterInfo[] parameters = method.GetParameters();
                // Loop through every parameter.
                foreach ( ParameterInfo paramInfo in parameters )
                {
                    Console.WriteLine( "\tParamter name: " + paramInfo.Name );
                    Console.WriteLine( "\tParamter type: " + paramInfo.ParameterType );
                }
                Console.WriteLine( "\tMethod return parameter: " + method.ReturnParameter );
                Console.WriteLine( "\tMethod return type: " + method.ReturnType );
                Console.WriteLine("\n");
            }
            // Invoke the Type that we got from the DLL.
            object Tobj = Activator.CreateInstance( runtimeType );
            // Create an array of numbers to pass to a method from that invokation.
            object[] inNums = new object[] { 2, 4 };
            // Invoke the 'Add' method from that Type invokation and store the return value.
            int outNum = (int)runtimeType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, Tobj, inNums );
            // Display the return value.
            Console.WriteLine( "Output from 'Add': " + outNum );

            Console.WriteLine( "\nPress any key to exit." );
            Console.ReadKey();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...