使用对象类型</t>的Insert <t>(T o)

时间:2011-03-11 14:11:06

标签: c# .net

我有一个方法

public void Insert<T>(T o) where T : class
{
            c.Set<T>().Add(o);
}

我需要将它与对象类型

一起使用
object x = ....

r.Insert(x);

但是因为它是一个对象T == object,但我需要它是x.GetType()类型

有谁知道怎么做?

4 个答案:

答案 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);
}