将盒装对象转换为typeof(对象)

时间:2013-05-09 11:08:31

标签: c# generics types casting boxing

我有以下POCO课程

public interface IObject
{
    Guid Uid { get; set; }
}

public class Boo : IObject
{
    public Guid Uid { get; set; }
    public String Name { get; set; }
}

public class Foo : IObject
{
    public Guid Uid { get; set; }
    public String Name { get; set; }
}

我正在尝试编写一个通用方法,将任何类型的对象插入到类型继承自IObject的数据库中。我正在使用以下方法(下面有ServiceStackOrmLite):

public interface IDataAccess
{
    IDbConnection GetConnection();

    Boolean InsertObject<T>(T newObj, IDbConnection connection) where T : IDataObject, new();
}

尝试单独插入每个对象的工作原理如下:

public static Boolean AddFoo(this Foo foo)
{
    // DataProvider is initiated using an implementation of IDataAccess
    return DataProvider.InsertObject(foo, DataProvider.GetConnection());
}

问题:

我正在尝试使用以下方法作为两者的有效方法,但它失败了。语法错误,但将其视为伪代码。我该如何实现这一目标? obj将是一个盒装FooBoo实例

public static Boolean AddObject(this IObject obj)
{
    Type objectType = obj.GetType();
    return DataProvider.InsertObject(obj as objectType, DataProvider.GetConnection());
}

2 个答案:

答案 0 :(得分:3)

我假设IObject / IDataObject是同一个东西 - 否则很难看出这个调用是如何工作的。因此,最简单的方法是让调用者提供T

public static bool AddObject<T>(this T obj) where T : IObject, new()
{
    return DataProvider.InsertObject<T>(obj, DataProvider.GetConnection());
}

但是,这并不总是可行(调用者可能了解IObject),在这种情况下,您也可以让运行时担心它:

public static bool AddObject(this IObject obj)
{
    return DataProvider.InsertObject((dynamic)obj, DataProvider.GetConnection());
}

唯一的另一个选择是通过MakeGenericMethod / Invoke进行反思 - 凌乱而缓慢。

坦率地说,我会在这里提倡非通用API。反思和仿制品不会成为好朋友。但是,ServiceStack可能不会给你这种奢侈,在这种情况下,dynamic方法可能是你最方便的选择。

答案 1 :(得分:0)

您可以尝试使用通用的AddObject扩展

public static bool AddObject<T>(this T obj) where T:IDataObject, new()
{
    return DataProvider.InsertObject(obj,DataProvider.GetConnection());
}