3

コンパイル時には、メソッドに渡す正確な型はわかりませんが、この型には何らかのプロパティが含まれていることは確かです。Type を関数に渡して関数内でキャストを実行するにはどうすればよいですか? 私はそのようなものを手に入れたいです:

foo (classType cl)
{
    int x = ((cl)SomeClass).Id.Value;
}
4

3 に答える 3

5

T タイプが制約されていないため、 .id を使用する場合、他の答えは機能しません。クラスは、任意の T が id というフィールド/プロパティを実装できることを認識していません

代わりに使用したと想像してください

foo <int>()

T は int になり、int には id フィールド/プロパティがありません

制約はできますが

foo <T>()
  where T : ClassTypeThatImplementsId
{
  int x = ((T)SomeClass).Value;
}

ただし、これは T がその特定の型にしかできないことを意味します。代わりに使用できる ID を持つ基本クラスはありますか? これがあなたが望む解決策であるかどうかはわかりませんが...

編集:

あなたの投稿への返信:

foo <T>()
  where T : BaseClass
{
  int x = ((T)SomeClass).Value;
}

BaseClass が 'Value' を実装していると仮定して動作するはずです (また、メソッド内で SomeClass への参照がないように見えるため、SomeClass がどこかから来ていると仮定します!)

于 2012-07-04T07:32:01.787 に答える
2

このようなものは機能しますが(これが達成しようとしている場合)、キャストは必要ありません:

public interface IHasInteger
{
    int Value { get; }
}

public class HasInteger : IHasInteger
{
    public int Value { get { return 1; } }
}

public class AlsoHasInteger : IHasInteger
{
    public int Value { get { return 2; } }
}

class Program
{
    static void Main(string[] args)
    {
        var a = new HasInteger();
        var b = new AlsoHasInteger();
        var c = new object();
        Console.WriteLine(GetInteger(a));
        Console.WriteLine(GetInteger(b));
        Console.WriteLine(GetInteger(c));
        Console.ReadLine();
    }

    private static int GetInteger(object o)
    {
        if (o is IHasInteger)
        {
            int x = ((IHasInteger)o).Value;
            return x;
        }

        return 0;
    }
}
于 2012-07-04T07:33:48.640 に答える
1

アップデート

foo <T>() : where SomeTypeHavingValue
{
  int x = ((T)SomeClass).Value;
}
于 2012-07-04T07:18:23.270 に答える