1

我有以下 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());
}
4

2 回答 2

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方法可能是您最方便的选择。

于 2013-05-09T11:32:56.617 回答
0

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

public static bool AddObject<T>(this T obj) where T:IDataObject, new()
{
    return DataProvider.InsertObject(obj,DataProvider.GetConnection());
}
于 2013-05-09T11:21:32.083 回答