我有一个方法
public void Insert<T>(T o) where T : class
{
c.Set<T>().Add(o);
}
我需要将它与对象类型
一起使用object x = ....
r.Insert(x);
但是因为它是一个对象T == object
,但我需要它是x.GetType()
类型
有谁知道怎么做?
答案 0 :(得分:5)
你基本上必须通过反思来调用它(例如使用MethodInfo.MakeGenericMethod
)。泛型是关于提供编译时类型的安全性,而在编译时你不知道类型。或者,如果您使用的是C#4,则可以使用动态类型。
使用反射是一个痛苦:
如果您使用的是C#4,动态类型解决方案将是:
dynamic d = x;
r.Insert(d);
答案 1 :(得分:4)
你可以使用反射来做到这一点:
var method = r.GetType().GetMethod("Insert").MakeGenericMethod(new[] { x.GetType() });
method.Invoke(r, new[] { x });
但效率非常低......如果你发现自己处于需要这样做的境地,你应该重新考虑你的设计
如果可以,请尝试提供方法的非通用版本:
public void Insert(object o) where T : class
{
c.Set(o.GetType()).Add(o);
}
(您还需要Set
的非通用版本)
答案 2 :(得分:2)
如果您知道类型,只需将其投射:
r.Insert((YourType)x);
如果您不知道:请参阅其他答案。
答案 3 :(得分:1)
您需要通过反射调用Insert命令,以便在运行时指定类型。
我会添加插入方法的第二个重载,如下所示:
private static readonly MethodInfo setMethod = typeof(WhateverCIs).GetMethod("Set");
public void Insert(object o)
{
var t = o.GetType();
var set = setMethod.MakeGenericMethod(new[] { t });
(set.Invoke(c) as WhateverSetReturns).Add(o);
}