要求通用方法在 FAIL 上抛出特定的异常类型

对,我知道我很可能用这个看起来像个白痴,但我的大脑只是不是今天早上开始装备。

我打算有一种方法,我可以声明“如果它变坏了,请返回这种类型的异常”,对吗?

例如,类似( 而且这也不起作用 ):

    static ExType TestException<ExType>(string message) where ExType:Exception
    {
        Exception ex1 = new Exception();
        ExType ex = new Exception(message);
        return ex;
    }

现在让我复杂的是,我们知道泛型类型将是异常类型,因为在哪里规定。 然而,由于我们不能无条件强制转换,代码失败了例外外型 . 我们也不能显式转换它,例如:

    static ExType TestException<ExType>(string message) where ExType:Exception
    {
        Exception ex1 = new Exception();
        ExType ex = (ExType)(new Exception(message));
        return ex;
    }

因为那也不足。 所以这个例子可行吗? 我有一种强烈的感觉,它实际上会很容易,但是我和老头子度过了艰难的一天,所以减少我的懈怠:P


更新

感谢人们的反应,看起来不是我是一个全部的针头! ;)

好的,所以 维加德山姆 在我可以实例化适当类型的点上获得了我,但是显然由于以下事实而被卡住了信息参数读取 - 仅符合实例化。

马特 的动作一针见血,我已经评估了这一点和所有工作惩罚。 这是示例代码:

    static ExType TestException<ExType>(string message) where ExType:Exception, new ()
    {
        ExType ex = (ExType)Activator.CreateInstance(typeof(ExType), message);
        return ex;
    }

甜的!

非常感谢你们!

12
2022-06-07 15:16:45
资源 分享
答案: 4

该服务的唯一问题是创建一个 Exception 的细分是可行的,它不使用单独的字符串参数实现一个 fitter,因此可能会抛出 MethodMissingException。

static void TestException<E>(string message) where E : Exception, new()
{
    try 
    {
      return Activator.CreateInstance(typeof(E), message) as E;
    } 
    catch(MissingMethodException ex) 
    {
      return new E();
    }
}
10
2022-06-07 18:08:30
资源

您是否尝试过,而是:

static T TestException<Exception>(string message)
{}

因为我有一种感觉,像所有可抛出的异常一样,放置通用约束并不重要必须无论如何从 System.Exception 获取。

请记住,仿制药确实会批准获得的种类。

1
2022-06-07 15:43:26
资源

我假设查看所有异常都应该有一个无参数的制造商,并且有 Message 建设,所以坚持需要工作:

static ExType TestException<ExType>(string message) where ExType:Exception
{
    ExType ex = new ExType();
    ex.Message = message;
    return ex;
}

编辑:好的,消息是只读的,所以你需要希望类执行异常(字符串)装配器。

static ExType TestException<ExType>(string message) where ExType:Exception
{
    return new ExType(message);
}
0
2022-06-07 15:43:09
资源

你几乎可以这样做:

static void TestException<E>(string message) where E : Exception, new()
{
    var e = new E();
    e.Message = message;
    throw e;
}

但是,由于 Exception.Message 只是读取,因此无法编译。 它只能通过将其传递给构建器来指定,并且没有机会使用默认承包商之外的其他东西来限制泛型类型。

我假设您需要使用表示 (Activator.CreateInstance) 来“新建”带有 message 参数的自定义异常类型,类似于:

static void TestException<E>(string message) where E : Exception
{
    throw Activator.CreateInstance(typeof(E), message) as E;
}

编辑哎呀只是知道你想要返回例外,不折腾。 使用相同的原理,所以我将把我的答案保留为 - 与 throw 语句一样。

23
2022-06-07 15:42:48
资源