C # и отражение - PullRequest
       21

C # и отражение

2 голосов
/ 30 августа 2009

Я новичок в C #, хотя и не программирую, поэтому, пожалуйста, прости меня, если я немного перепутаю - это совершенно непреднамеренно. Я написал довольно простой класс под названием «API», который имеет несколько открытых свойств (аксессоры / мутаторы). Я также написал консольное приложение для тестирования, которое использует отражение, чтобы получить алфавитный список имен и типов каждого свойства в классе:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using MyNamespace;      // Contains the API class

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hi");

            API api = new API(1234567890, "ABCDEFGHI");
            Type type = api.GetType();
            PropertyInfo[] props = type.GetProperties(BindingFlags.Public);

            // Sort properties alphabetically by name.
            Array.Sort(props, delegate(PropertyInfo p1, PropertyInfo p2) { 
                return p1.Name.CompareTo(p2.Name); 
            });

            // Display a list of property names and types.
            foreach (PropertyInfo propertyInfo in type.GetProperties())
            {
                Console.WriteLine("{0} [type = {1}]", propertyInfo.Name, propertyInfo.PropertyType);
            }
        }
    }
}

Теперь мне нужен метод, который перебирает свойства и объединяет все значения в строку запроса. Проблема в том, что я хотел бы сделать это функцией самого класса API (если это возможно). Мне интересно, имеют ли статические конструкторы какое-то отношение к решению этой проблемы, но я работал с C # всего несколько дней и не смог понять это.

Любые предложения, идеи и / или примеры кода будут с благодарностью!

1 Ответ

5 голосов
/ 30 августа 2009

Это не связано с static конструкторами. Вы можете сделать это с помощью static методов :

class API {
    public static void PrintAPI() {
       Type type = typeof(API); // You don't need to create any instances.
       // rest of the code goes here.
    }
}

Вы можете позвонить по этому номеру:

API.PrintAPI(); 

Вы не используете экземпляры при вызове static методов.

Обновление: Для кэширования результата вы можете сделать это либо при первом вызове, либо в static инициализаторе:

class API {
    private static List<string> apiCache;
    static API() {
        // fill `apiCache` with reflection stuff.
    }

    public static void PrintAPI() {
        // just print stuff from `apiCache`.
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...