3

在编译时,我不知道我将传递给方法的确切类型,但我确信这种类型将包含一些属性。如何将类型传递给函数以在函数中执行强制转换?我想得到类似的东西:

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

3 回答 3

5

使用 .id 时,另一个答案将不起作用,因为您的 T 类型不受限制。该类不知道任何 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 来自某个地方,因为方法中似乎没有引用它!)

于 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 回答