5

NuGetのFastMemberを使用して、ジェネリック リストを DataTable に変換するメソッドを作成しました。

これは私のコードです:

public  DataTable ConvertGenericListToDataTable(List<CustomObject> inputList)
{
    var dt = new DataTable();
    using (var reader = ObjectReader.Create(inputList))
    {
         dt.Load(reader);
    }
    return dt;
}


var customObject = new List<CustomObject>();
var dt = ListToDataTable.ConvertGenericListToDataTable(customObject);

これはうまくいきます。Customobject は私が作成したカスタム オブジェクトです。メソッドに渡したいいくつかの異なるリストがありList<CustomobjectA>ますList<CustomobjectB>。DataTable に変換したいすべてのタイプのリストのメソッドを作成することはそれほど問題ではありませんが、これは同じコード行を何度も繰り返すことになる可能性があります。これは明らかに防止したいことです。

パラメータのタイプをList<object>andに変更してみましたList<dynamic>。次に、「ConvertGenericListToDataTable に最適なオーバーロード メソッドに無効な引数がいくつか含まれている」ため、コードはコンパイルされません。

オブジェクトの正確なタイプを定義せずに、オブジェクトのリストをパラメーターとして渡す方法はありますか?

4

4 に答える 4

2

ConvertGenericListToDataTableジェネリックメソッドを持つことはどうですか?

public  DataTable ConvertGenericListToDataTable<T>(List<T> inputList)
{
}
于 2013-08-01T09:40:47.010 に答える
1

「CustomObject」インターフェイスを実装するクラスの一部でなければならないメソッドとプロパティを定義する「CustomObject」のインターフェイスを作成します。次に、'CustomObjectA' と 'CustomObjectB' が 'CustomObject' インターフェイスを継承していることを確認し、'CustomObjectA' と 'CustomObjectB' で必要なすべての実装を行います。

「ConvertGenericListToDataTable」メソッドが任意の「CustomObject」を受け入れるようにするには、単に「CustomObject」インターフェースを実装する任意のクラスを受け入れるようにします。

このようにして、リストで提供されるオブジェクトが予期されるメソッドとプロパティを持っていることを確認します。

構文が間違っている可能性がありますが、次のようなものです。

interface ICustomObject
{
    public string RequiredProperty { get; }

    public void RequiredMethod();
}

public class CustomObjectA : ICustomObject
{
    public string RequiredProperty
    {
        get
        {
            return "I'm CustomObjectA";
        }
    }

    public void RequiredMethod()
    {
        // do anything
    }
}

public class CustomObjectB : ICustomObject
{
    public string RequiredProperty
    {
        get
        {
            return "I'm CustomObjectB";
        }
    }

    public void RequiredMethod()
    {
        // do anything
    }
}

public void AcceptsAllCustomObjects(List<ICustomObject> Cookies)
{
    Console.WriteLine(Cookies[0].RequiredProperty);
}
于 2013-08-06T21:01:48.750 に答える
0

メソッドで行ったように、入力パラメータとして使用される抽象 CustomObject クラスを CustomobjectA または CustomObjectB に継承させる必要があります。

于 2013-08-01T09:36:22.097 に答える
0

私はこれを試してみましたが、うまくいきました

public static DataTable ConvertGenericListToDataTable<T>(this List<T> inputList)
{
    var dt = new DataTable();
    using (var reader = ObjectReader.Create(inputList))
    {
        dt.Load(reader);
    }
    return dt;
}
于 2015-12-20T19:42:11.327 に答える