ジェネリック関数があります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の文字列メソッドが遅いため、遅くなります。EqualsGetHashCode
代わりに文字列を使用する場合は、文字列のスイッチを操作するときにコンパイラが実行するのと同じです。
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)
{ ... }
}