[英]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.