我有以下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
将是一个盒装Foo
或Boo
实例
public static Boolean AddObject(this IObject obj)
{
Type objectType = obj.GetType();
return DataProvider.InsertObject(obj as objectType, DataProvider.GetConnection());
}
答案 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());
}