C#从方法签名中实例化泛型类型

时间:2015-08-03 07:47:51

标签: c# generics

我最近一直在使用通用方法,并遇到了类似这样的方法:

public static void Requires<TException>(bool condition, string message) where TException : Exception

据我了解,在使用上述方法时,您提供的Type继承自Exception,如果conditionfalse提供的Exception类型扔了。

这如何在引擎盖下工作?
TException是否像throw new TException();那样实例化了? 如果方法不知道message,那么如何传递Type参数(它只知道它继承了类型Exception)?

3 个答案:

答案 0 :(得分:3)

根据MSDN:System.Exception确实有一个构造函数,它接受一个字符串作为参数。此字符串表示消息。

Activator-Class的帮助下,您可以执行以下操作:

 using System;

public class Test
{

   public static void Requires<TException>(bool condition, string message) 
where TException : Exception
{
    Exception exception = (Exception)Activator.CreateInstance(typeof(TException),message);
    throw exception;
}

  public static void Main()
  {
      try
      {
          Requires<ArgumentNullException>(true,"Test");
      }
      catch(Exception e)
      {
          Console.WriteLine(e);
      }

   }
}

工作示例: http://ideone.com/BeHYUO

答案 1 :(得分:2)

  

据我所知,在使用上述方法时,您提供了一个继承自Exception的Type,如果条件为false,则抛出提供的Exception类型。

这取决于方法的实现,所有它说的是Requires方法的类型参数必须具有Exception的基本类型。但如果条件为false,很可能会创建该类型的异常。一种方法是使用Activator.CreateInstance方法。

答案 2 :(得分:1)

  

如果Type未知,如何传递message参数?   方法

Ned Stoyanov 的回答类似,由实施该方法的人决定如何使用此参数。它可以用作异常中嵌入的消息,可以在其他地方使用,也可以根本不使用。参数名称仅建议它将用于什么,但调用者无法保证它将按预期使用。它也可以被称为djfhsfjfh