我有一个通用功能static Log<T>(T Log)
。我想检查类型T
并决定下一步做什么。
这是我到目前为止得到的:
public static void Log<T>(T log)
{
switch (typeof(log))
{ ... }
}
我究竟做错了什么?我的错误是 typeof(log) 不起作用。
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());
您需要询问 typeofT
不是log
- 并且开关必须在原始类型(或 a string
)上,因此请查看类型Name
或可能FullName
switch(typeof(T).Name){...}
您还可以调用GetType
以下实例T
:
switch(log.GetType().Name){...}
两者都会产生相同的结果
使用GetType
功能
switch(log.GetType().ToString()) {....}
安装的 typeof().
您不能对 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.Name
or 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)
{ ... }
}