簡體   English   中英

什么是像Class這樣的參數化類型的等效C# <? extends Throwable> 在Java中?

[英]What is the equivalent C# of a parameterized type like Class<? extends Throwable> in Java?

我寫了這個博客: http ://tri-katch.blogspot.com並實現了pahakia-fault庫: https : //github.com/pahakia/lib

我想將pahakia-fault庫轉換為C#。 但是如何將以下內容轉換為C#?

public CodeBlockWorker<T> ignore(Class<? extends Throwable> clazz,
        @SuppressWarnings("unchecked") Class<? extends Throwable>... classes) {
    String[] codes = new String[classes.length];
    for (int i = 0; i < codes.length; i++) {
        Class<? extends Throwable> clz = classes[i];
        codes[i] = clz.getName();
    }
    handlers.add(new KatchHandler<T>(clazz.getName(), codes));
    return this;
}

我知道C#具有Type作為Java中Class的等效項,但是Type沒有參數化。

因此,如果我想使用類型本身而不是實例,該如何在C#中表示參數化類型?

謝謝。

我的Java有點生銹,但是我認為您可以嘗試通過使用GetType方法獲取傳遞的參數的類型來完成:

public CodeBlockWorker<T> Ignore(
      Exception clazz, params Exception[] classes)
{

    handlers.add(
       new KatchHandler<T>(
           //You can use FullName if you want to include the namespace
           clazz.GetType().Name, 
           classes.Select(t => t.GetType().Name)
           /* might need to call .ToArray() if your Constructor expects an array */);

    return this;
}

正確一點,這是怎么回事。 由於.Net中的任何“可拋出”異常(即可以在try / catch中使用的Exception )都必須繼承自Exception ,因此可以將方法參數設置為使用Exception params關鍵字只是對編譯器的提示,它允許多個方法參數作為數組自動傳遞。

.net中的Object具有方法GetType ,它將返回該實例的Type。 您可以通過Name獲得類名,也可以通過FullName獲得類名和名稱空間。 您還可以使用關鍵字typeof獲取通用參數的類型。

最后, .Select方法具有一些linq的優點,該方法在可枚舉(即數組)上執行轉換/投影,在這種情況下,返回classes中每個名稱的可枚舉。

更新

如果您嘗試使用類型而不是異常實例,則還可以嘗試使用泛型類型參數和typeof關鍵字編寫方法以獲取類型參數的類型:

 public CodeBlockWorker<T> Ignore<TClazz, TClasses>()
    where TCLazz : Exception
    where TClasses : Exception
 {
     var typename = typeof(TClazz).Name;
 }

where子句強制調用者傳遞異常類:

 Ignore<NullReferenceException, ArgumentException>();

如果要允許調用方放置多個TClasses ,則必須為每種其他類型創建其他方法重載(這是對Action的完成方式:

 Ignore<TClazz, T1, T2>(){}
 Ignore<TClazz, T1, T2, T3>(){}

但是,您可以將這些替代中的每一個都饋入同一方法:

 private CodeBlockWorker<T> DoWork(Type TClazz, params Type[] TClasses){}
 public CodeBlockWorker<T> Ignore<TClazz, T1, T2, T3>()
 {
     return DoWork(typeof(TClazz), typeof(T1), typeof(T2), typeof(T3));
 }

或者,您可以編寫它以便調用者必須傳入類型,但是沒有一種方法可以限制在編譯時傳入的值。 就像您無法創建具有整數參數的方法一樣,該方法將值限制為“ 5”和“ 42”; 您只能在運行時執行此操作。

Ignore(Type clazz, params Type[] classes){

    var typename = clazz.Name;
}

這稱為:

Ignore(
    typeof(NullReferenceException), 
    typeof(ArgumentException), 
    typeof(DivideByZeroException));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM