2014-11-05 239 views
1

我想做一些我以前在Java中做過的事情,但需要在C#中使用創建數組類對象

Java中的代碼,那些將類似於:

public Class<? extends Thing>[] classes = new Class<? extends Thing>[3] { 
    OneThing.class, 
    AnotherThing.class 
    YetAnotherThing.class 
    // etc. 
} 

這是可能在C#中以任何方式?最終我想要做的是有一個代表項目類型的類的數組。然後這個數組用於檢查項目的類型以產生一個布爾值,表示該項目是否具有數組中索引的超類。爲了澄清,我正在檢查,看看是否類Thing的實例也是OneThingAnotherThing實例等

重要的是,我試圖創建一個數組不是一個常規對象像Random,但無論C#的類對應的是Java Class類。

+0

如果我正確記住我的Java(並且我可能不會),那麼您試圖聲明一個_type_實例的數組,其中每個類型都繼承基類型「Thing」。正確?如果是這樣,那麼我不認爲C#的通用約束系統允許這樣做。即它可以基於它實際繼承的類型來約束一個類型,但是它不能約束'Type'的_instance_來完成相同的操作。你必須實現一些在運行時強制執行的東西。 – 2014-11-05 02:01:08

+0

@PeterDuniho我想要做的是創建一個類的數組,其中每個類是「事」的孩子。我正在檢查對象的實際類(它在很大程度上是「Thing」)是否也是由傳遞給函數的索引指定的類的子類(未顯示)。 – Treyzania 2014-11-05 02:06:56

+0

好吧,所以我的確理解正確。在這種情況下,我認爲最接近的是一個帶有「where T:Type」約束的自定義包裝類,然後在內部強制約束T是一個Type類型實例,該實例表示繼承「Thing」的實際類型。我會舉一個例子作爲答案,但我不想阻止C#泛型專家的參與。如果沒有其他人,我會很樂意在12-24小時內做到這一點。 – 2014-11-05 02:12:50

回答

0

與Java不同,其中Class<T>是該類所代表類型的通用對象,System.Type C#的對象根本不是通用的。可以按如下方式創建它們的數組:

Type[] classes = new[] { 
    typeof(OneThing) 
, typeof(AnotherThing) 
, typeof(ThirdThing) 
}; 

但是,編譯器是無法強制執行這些類從導出支票或實現特定的鹼或接口。你應該能夠在沒有此限制執行你的支票,但:

var obj = ... // This is your object 
var res = classes.Select((t, i) => new {t, i}).FirstOrDefault(p => p.t.IsAssignableFrom(typeof(obj))); 
if (res != 0) { 
    Console.WriteLine("{0} assignable from {1} is found at {2}.", res.t, typeof(obj), res.i); 
} else { 
    Console.WriteLine("Type {0} is not found in the array.", typeof(obj)); 
} 
0

在C#中,我們有System.Type你可以創建它的收集和保存所有類的類型吧。然後你可以應用你的規則。用於反射目的的c#中使用了Type。檢查C#反射更多。這是一個簡單的代碼,演示你所要求的內容。我試圖保持它非常簡單,不要混用其他c#概念,這樣對於新來c#的人來說,它會更容易理解。

using System.IO; 
using System; 
using System.Collections.Generic; 


class Program 
{ 
    static List<Type> list = new List<Type>(); 

    static void Main() 
    { 

     list.Add(typeof(A)); 
     C c = new C(); 
     D d = new D(); 

     Check(c); 
     Check(d); 

    } 

    static void Check(Object toBeChecked){ 

     foreach (Type t in list) 
     { 
      if(t.IsAssignableFrom(toBeChecked.GetType())){ 
       System.Console.WriteLine("Yes it is type of"); 
       return; 
      } 
      System.Console.WriteLine("No it is not type of"); 
     } 
    } 
} 

class A{ 

} 

class C : A{ 

} 

class D{ 

}