C#中静态类的反射

本文关键字:反射 静态类 | 更新日期: 2023-09-27 18:27:10

我创建了一个静态类,并在反射中使用了它。但当我访问该类的Methods时,它显示了5个方法,但我只创建了1个。额外的方法是

Write
ToString
Equals
GetHashCode
GetType

但我只创建了Write方法。

一个静态方法可以在一个静态类中,但这额外的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();            
        }
    }
}

但是如何创建静态类的对象来访问这些方法静态类不能有非静态方法

C#中静态类的反射

在静态类中只能声明静态成员,但就CLR而言,它只是另一个类,恰好只有静态成员,没有构造函数,并且是抽象的和密封的。CLR没有静态类的概念。。。因此该类仍然继承来自CCD_ 1的实例成员。

这是一个很好的例子,说明了为什么区分语言功能、框架特性和运行时特征很重要。

C#中的每个类型都(直接或间接)继承自System.Object。从而继承了Object的方法ToStringGetHashCodeEqualsGetType。这就是您在探索ReflectionTest类型对象的所有方法时看到它们的原因。要只获取静态方法,请使用以下BindingFlags枚举成员:

type.GetMethods(System.Reflection.BindingFlags.Static)

这些其他方法继承自object0基类。

BindingFlags.DeclaredOnly传递给GetMethods()以消除继承的方法。

这些方法是从object类派生的,所有类都是从该类派生的。

所有这些"附加"方法都来自object(别名)/object,C#中的基类everything。这是报价:

在C#的统一类型系统中,所有类型,预定义的和用户定义的,引用类型和值类型,都直接或间接继承自Object

使用BindingFlags时,必须显式指定所需的方法标志:

type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static);

您可以看到Object方法(即使不是静态的)。为了限制你的方法列表,你应该指定你只想要使用BindingFlags.Static的静态方法。不管你的类被标记为静态,我想出于与第一个.NET版本的兼容性原因,修饰符只适用于编译器(你不能创建实例等等)。

静态类继承自System.Object,这就是获得这些方法的地方。您可以查看MethodInfo.DeclaringType进行检查。