在编译时,我不知道我将传递给方法的确切类型,但我确信这种类型将包含一些属性。如何将Type传递给函数以在函数中执行转换?我想得到类似的东西:
foo (classType cl)
{
int x = ((cl)SomeClass).Id.Value;
}
答案 0 :(得分: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来自某个地方,因为方法中似乎没有引用它!)
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
<强>更新强>
foo <T>() : where SomeTypeHavingValue
{
int x = ((T)SomeClass).Value;
}