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ボックス化FooまたはBooインスタンスになります

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 に答える