ジェネリック関数がありますstatic Log<T>(T Log)
。タイプを確認T
して、次に何をするかを決めたいと思います。
これは私がこれまでに得たものです:
public static void Log<T>(T log)
{
switch (typeof(log))
{ ... }
}
私は何が間違っているのですか?私のエラーは、typeof(log)が機能しないことです。
typeof not-を尋ねる必要がありますT
-log
そしてスイッチはプリミティブ型(またはstring
)でなければならないので、型Name
またはおそらくを見てくださいFullName
switch(typeof(T).Name){...}
GetType
次のインスタンスを呼び出すこともできますT
:
switch(log.GetType().Name){...}
どちらも同じ結果になります
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である必要があるため、Vehicleのメソッドにアクセスできます。車をメソッドに渡すことができますが、それでもMoveVehicle
メソッドを呼び出すことができます。
a<Vehicle>(new Car());
使用GetType
機能
switch(log.GetType().ToString()) {....}
の typeof().
をオンにすることはできません。また、変数をオンにする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
(viaType.Name
または)を使用してこれを行うこともできますが、 (sure)およびfor (の実装に応じて)Type.FullName
の文字列メソッドが遅いため、遅くなります。Equals
GetHashCode
代わりに文字列を使用する場合は、文字列のスイッチを操作するときにコンパイラが実行するのと同じです。
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)
{ ... }
}