我有一个通用函数static Log<T>(T Log)
。我想检查T
的类型并决定下一步该做什么。
这是我到目前为止所得到的:
public static void Log<T>(T log)
{
switch (typeof(log))
{ ... }
}
我做错了什么?我的错误是typeof(log)不起作用。
答案 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.Name
或Type.FullName
)执行此操作,但它会因为Equals
(确定)和{的字符串方法而变慢{1}}(取决于它们的实现)较慢。
当您使用String时,它与编译器在使用String上的开关时所做的相同。
GetHashCode
根据您要归档的内容,您应该知道您也可以使用约束:
switch(typeof(T).FullName) // Converted into a dictionary lookup
{ ... }