Отражение для статического класса в C # - PullRequest
7 голосов
/ 09 марта 2012

Я создал статический класс и использовал его в Reflection.Но когда я получил доступ к методам этого класса, он показывает 5 методов, но я создал только 1. Дополнительные методы

Write
ToString
Equals
GetHashCode
GetType

Но я создал только методы Write.

OneСтатические методы могут быть в статическом классе, но эти дополнительные 4 метода не являются статическими и не являются источником их происхождения.Каков базовый класс для этого

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Reflection;

namespace ReflectionDemo
{
    static class ReflectionTest
    {
        public static int Height;
        public static int Width;
        public static int Weight;
        public static string Name;

        public static void Write()
        {
            Type type = typeof(ReflectionTest);         //Get type pointer
            FieldInfo[] fields = type.GetFields();      //obtain all fields
            MethodInfo[] methods = type.GetMethods();
            Console.WriteLine(type);
            foreach (var item in methods)
            {
                string name = item.Name;
                Console.WriteLine(name);
            }

            foreach (var field in fields)
            {
                string name = field.Name; //(null); //Get value
                object temp = field.GetValue(name);
                if (temp is int) //see if it is an integer
                {
                    int value = (int)temp;
                    Console.Write(name);
                    Console.Write("(int) = ");
                    Console.WriteLine(value);
                }
                else if (temp is string)
                {
                    string value = temp as string;
                    Console.Write(name);
                    Console.Write("(string) = ");
                    Console.WriteLine(value);
                }
            }
        }        
    }
    class Program
    {
        static void Main(string[] args)
        {
            ReflectionTest.Height = 100;
            ReflectionTest.Width = 50;
            ReflectionTest.Weight = 300;
            ReflectionTest.Name = "Perl";

            ReflectionTest.Write();

            Console.ReadLine();            
        }
    }
}

Но как создать объект статического класса для доступа к этим методам Статический класс не может иметь нестатических методов

Ответы [ 8 ]

24 голосов
/ 09 марта 2012

Только статические члены могут быть объявлены в статическом классе - но для CLR это просто другой класс, который имеет только статические члены, не имеет конструктора и является одновременно абстрактным и запечатанным. CLR не имеет концепции статического класса ... поэтому класс все еще наследует элементы экземпляра от object.

Это хороший пример того, почему важно различать язык функции, framework функции и runtime функции.

10 голосов
/ 09 марта 2012

Каждый тип в C # наследуется (прямо или косвенно) от System.Object. Таким образом наследуя Object методы ToString, GetHashCode, Equals и GetType. Вот почему вы видите их, изучая все методы объекта типа ReflectionTest. Чтобы получить только статические методы, используйте член перечисления BindingFlags:

type.GetMethods(System.Reflection.BindingFlags.Static)
3 голосов
/ 09 марта 2012

Эти другие методы унаследованы от базового класса Object.

Передайте BindingFlags.DeclaredOnly в GetMethods(), чтобы исключить унаследованные методы.

1 голос
/ 27 мая 2013

При использовании BindingFlags вы должны явно указать нужные флаги метода:

type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static);
1 голос
/ 09 марта 2012

Все эти «дополнительные» методы происходят от объекта (псевдонима) / объекта , базового класса всего в C #. Вот цитата:

В единой системе типов C # все типы, предопределенные и определенные пользователем, ссылочные типы и типы значений, наследуются прямо или косвенно от Object.

1 голос
/ 09 марта 2012

Эти методы являются производными от класса object, от которого все классы являются производными.

0 голосов
/ 09 марта 2012

Статические классы наследуются от System.Object, и вот откуда вы получаете эти методы.Вы можете посмотреть на MethodInfo.DeclaringType, чтобы проверить.

0 голосов
/ 09 марта 2012

Вы видите Object методы (даже если не статичные).Чтобы ограничить список методов, вы должны указать, что вы хотите использовать только статические методы, использующие BindingFlags.Static. Не имеет значения, что ваш класс помечен как статический, я полагаю, по причинам совместимости с первыми версиями .NET этот модификатор предназначен только для компиляторов (вы не можетесоздать экземпляр и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...