将盒装对象强制转换为typeof(object)
本文关键字:typeof object 转换 盒装 对象 | 更新日期: 2023-09-27 18:12:44
我有以下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());
}
我假设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
反射-混乱和缓慢。
dynamic
方法可能是这里最方便的选择。
您可以尝试使用通用AddObject扩展
public static bool AddObject<T>(this T obj) where T:IDataObject, new()
{
return DataProvider.InsertObject(obj,DataProvider.GetConnection());
}