繁体   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