2

ジェネリック関数がありますstatic Log<T>(T Log)。タイプを確認Tして、次に何をするかを決めたいと思います。

これは私がこれまでに得たものです:

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

私は何が間違っているのですか?私のエラーは、typeof(log)が機能しないことです。

4

4 に答える 4

3

typeof not-を尋ねる必要がありますT-logそしてスイッチはプリミティブ型(またはstring)でなければならないので、型Nameまたはおそらくを見てくださいFullName

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

GetType次のインスタンスを呼び出すこともできますT

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

どちらも同じ結果になります

于 2012-10-09T12:42:17.977 に答える
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である必要があるため、Vehicleのメソッドにアクセスできます。車をメソッドに渡すことができますが、それでもMoveVehicleメソッドを呼び出すことができます。

  a<Vehicle>(new Car());
于 2012-10-09T13:04:31.093 に答える
2

使用GetType機能

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

typeof().

于 2012-10-09T12:42:31.983 に答える
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(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)
    { ... }
}
于 2012-10-09T13:12:07.273 に答える