将盒装对象强制转换为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将是盒装的FooBoo实例

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

将盒装对象强制转换为typeof(object)

我假设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方法可能是这里最方便的选择。

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

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