Réflexion Pour la Classe Statique en C#
J'ai créé une Classe Statique et utilisé que dans la Réflexion.
Mais quand j'ai consulté les Méthodes de la classe, son score 5 méthodes mais j'ai créé seulement 1.
Les méthodes supplémentaires sont
Write
ToString
Equals
GetHashCode
GetType
Mais j'ai créé uniquement les méthodes d'Écriture.
L'une des méthodes statiques peuvent être dans une classe statique, mais ces 4 méthodes ne sont pas de la statique et de l'endroit où ils ont dirigé. Quelle est la classe de base pour que
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();
}
}
}
Mais comment faire pour créer un objet d'une classe statique pour accéder à ces méthodes
statique de la classe ne peut pas avoir non statique méthodes
Vous devez vous connecter pour publier un commentaire.
Chaque type en C# hérite (directement ou indirectement) de la
System.Object
. Ce qui héritentObject
's méthodesToString
,GetHashCode
,Equals
etGetType
. C'est pourquoi vous voyez entre eux, tout en explorant toutes les méthodes deReflectionTest
type d'objet. Pour ne recevoir que des méthodes statiques utiliser cetteBindingFlags
membre enum:ReflectionTest
classe en aucune façon. Ce sont les méthodes deType type = typeof(ReflectionTest)
objet que vous créez. Ils n'existent pas dans un contexte deReflectionTest
classe, et vous ne pouvez pas accéder à tous les.Write
méthode est totalement une autre histoire - c'est une partie deReflectionTest
déclaration, et vous pouvez y accéder le plus simplementReflectionTest.Write
.Type
qui représente votre classeReflectionTest
. En plus des informations sur votre classe, il contient également des informations communes (y compris les méthodes) tous les objets contiennent.Uniquement de membres statiques peuvent être déclaré dans une classe statique - mais aussi loin que le CLR est concerné, c'est juste une autre classe, qui se trouve seulement à des membres statiques, n'a pas de constructeur, et est à la fois abstrait et scellé. Le CLR qui n'ont pas de concept d'une classe statique... de sorte que la classe hérite des membres de l'instance de
object
.C'est un bon exemple de pourquoi il est important de faire la distinction entre langue fonctionnalités, cadre caractéristiques et runtime fonctionnalités.
Ces autres méthodes sont héritées de la
Objet
de la classe de base.Passer
BindingFlags.DeclaredOnly
àGetMethods()
à éluder les méthodes héritées.Ces méthodes sont dérivées de la
object
classe à partir de laquelle toutes les classes nativement en tirer.Tous ces "autres" méthodes viennent de objet (alias) /Objet la classe de base, tout en C#.
Voici la citation:
Dans le système de type unifié de C#, tous les types prédéfinis et définis par l'utilisateur, les types de référence et des types de valeur, héritent directement ou indirectement de l'Objet.
Lors de l'utilisation de BindingFlags vous devez spécifier explicitement la méthode désirée drapeaux:
Vous voir
Object
méthodes (même si non statique). Pour restreindre votre méthode de la liste, vous pouvez spécifier que vous souhaitez que seules les méthodes statiques à l'aide deBindingFlags.Static
Il n'a pas d'importance de votre classe est marquée comme étant statique, je suppose que pour des raisons de compatibilité avec les premières .NET versions modificateur est seulement pour les compilateurs (vous ne pouvez pas créer une instance et ainsi de suite).Statique classes héritent de
System.Object
, et c'est là que vous obtenez ces méthodes. Vous pouvez regarderMethodInfo.DeclaringType
à vérifier.