2012-03-09 122 views
4

我已經創建了一個靜態類,並在反射中使用它。 但是,當我訪問的類,它的顯示5種方法的方法,但我只有1 創造了額外的方法是C#中靜態類的反射#

Write 
ToString 
Equals 
GetHashCode 
GetType 

但我只創造了書寫方法。

一個靜態方法可以在靜態類中,但這些額外的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

C#中的每種類型都從System.Object(直接或間接)繼承。由此繼承Object的方法ToStringGetHashCode,EqualsGetType。這就是爲什麼你在探索ReflectionTest類型對象的所有方法時看到它們的原因。要獲得唯一的靜態方法使用此BindingFlags枚舉成員:

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

但我無法從我的類中獲取這些方法,就像我們獲得的靜態類'ReflectionTest.GetType()' – 2012-03-09 11:35:24

+0

而且我們也無法爲靜態類創建對象。以及如何不靜態成員可以繼承靜態類 – 2012-03-09 11:36:25

+0

正確的,那是因爲這些方法不是靜態的。但是,您正在探索Type對象,並且您會看到靜態方法和非靜態方法。 – Andrei 2012-03-09 11:39:41

1

這些方法是從object類派生的基類,所有類本地派生。

3

那些其他方法繼承自Object基類。

通過BindingFlags.DeclaredOnlyGetMethods()來遺傳的方法。

+0

它不工作......即使我的方法「寫」不是顯示 – 2012-03-09 11:54:46

0

你看Object方法(即使不是靜態的)。要限制你的方法列表,你應該指定你只需要使用靜態方法BindingFlags.Static你的類被標記爲靜態並不重要,我想出於兼容性的原因,第一個.NET版本的修改器只適用於編譯器(你不能創建實例等)。

1

所有這些「額外」方法都來自於object (alias)/Object,它是C#中的基類。 以下是引用:

在C#的統一類型系統中,所有類型,預定義和用戶定義的引用類型和值類型都直接或間接地從Object繼承。

0

靜態類繼承自System.Object,這就是您從中獲取這些方法的地方。你可以看看MethodInfo.DeclaringType來檢查。

21

只有靜態成員可以聲明在靜態類 - 但至於CLR而言,它只是一個類,這恰好只有靜態成員,沒有一個構造函數,既是抽象並密封。 CLR沒有靜態類的概念 ...所以該類仍繼承object的實例成員。

這就是爲什麼區分功能之間語言,框架功能和運行功能是非常重要的一個很好的例子。

1

使用的BindingFlags必須明確指定所期望的方式標誌:

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