c#未知输入参数类型?

时间:2012-10-09 12:39:53

标签: c# generics

我有一个通用函数static Log<T>(T Log)。我想检查T的类型并决定下一步该做什么。

这是我到目前为止所得到的:

public static void Log<T>(T log)
{
    switch (typeof(log))
    { ... }
}

我做错了什么?我的错误是typeof(log)不起作用。

4 个答案:

答案 0 :(得分:3)

您需要询问T的类型而不是log - 并且切换必须位于基本类型(或string)上,因此请查看类型Name或也许FullName

switch(typeof(T).Name){...}

您还可以在GetType的实例上调用T

switch(log.GetType().Name){...}

两者都会产生相同的结果

答案 1 :(得分:3)

switch (expression)
{

}

expression =整数或字符串类型表达式(来自MSDN)

http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.71).aspx

typeof关键字既不返回这些关键字。您无法使用log.GetType(),因为您需要符合Type不适合的上述条件。

为了安全起见,我会将此限制为if语句以及相应的类型,因为这将实现相同的目的。

static void a<T>(T b)
{
  if (typeof(T) == typeof(B))
    Console.WriteLine("T is B");
  else if(typeof(T) == typeof(C))
    Console.WriteLine("T is C");
}

编辑:

如果你有论据,你有:

  public class Vehicle 
  {
    public virtual int MoveVehicle() 
    {
       //Do Logic
       return 0;
    }
  }
  public class Car : Vehicle { }

你想要一个通用的方法移动车辆你可以做一些叫做generic type constraints

的事情
static void a<T>(T b) where T : Vehicle
{
    int newPosition = b.MoveVehicle();
}

http://msdn.microsoft.com/en-us/library/bb384067.aspx

T必须是现在的车辆,因此您可以访问Vehicle中的方法。您可以将汽车传递给该方法,它仍然可以调用MoveVehicle方法。

  a<Vehicle>(new Car());

答案 2 :(得分:2)

使用GetType功能

  switch(log.GetType().ToString()) {....}

而不是typeof().

答案 3 :(得分:0)

解决方案

您无法切换System.Type,也无法对变量执行typeof。 你能做的是:

static Dictionary<Type, TypeEnum> Types = new Dictionary<Type, TypeEnum>() { { typeof(TypeA), TypeEnum.TypeA } }; // Fill with more key-value pairs

enum TypeEnum
{
    TypeA
    // Fill with types
}


public static void Log<T>(T log)
{
    TypeEnum type;
    if (Types.TryGetValue(typeof(T), out type)) {
        switch (type)
        { ... }
    }
}

这也是我所知道的最快的解决方案。字典查找速度非常快。您也可以使用System.String(通过Type.NameType.FullName)执行此操作,但它会因为Equals(确定)和{的字符串方法而变慢{1}}(取决于它们的实现)较慢。

当您使用String时,它与编译器在使用String上的开关时所做的相同。

GetHashCode

更多想法

根据您要归档的内容,您应该知道您也可以使用约束:

switch(typeof(T).FullName) // Converted into a dictionary lookup
{ ... }