2

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

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

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

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

4

4 回答 4

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 { }

你想要一个通用的方法来移动 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,因此您可以访问 Vehicle 中的方法。您可以将汽车传递给该方法,它仍然可以调用该MoveVehicle方法。

  a<Vehicle>(new Car());
于 2012-10-09T13:04:31.093 回答
3

您需要询问 typeofT不是log- 并且开关必须在原始类型(或 a string)上,因此请查看类型Name或可能FullName

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

您还可以调用GetType以下实例T

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

两者都会产生相同的结果

于 2012-10-09T12:42:17.977 回答
2

使用GetType功能

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

安装的 typeof().

于 2012-10-09T12:42:31.983 回答
0

解决方案

您不能对 a 进行开关System.Type,也不能typeof对变量进行 a。你可以做的是:

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( via Type.Nameor Type.FullName) 执行此操作,但它会更慢,因为Equals( sure ) 和 for GetHashCode( 取决于它们的实现) 的字符串方法更慢。

当您改用 String 时,编译器在使用 String 上的 switch 时所做的相同。

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

更多想法

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

public interface ILogItem
{
    String GetLogData();
    LogType LogType { get; }
}

public void Log<T>(T item) 
    where T : ILogItem
{
    Debug.WriteLine(item.GetLogData());
    // Read more data
    switch (item.LogType)
    { ... }
}
于 2012-10-09T13:12:07.273 回答