3

私が制御できないライブラリからの戻り値としてインターフェイスを取得します。

public interface IA : IB { String A { get;} }
public interface IB { String B { get;} }

このコードを実行しようとすると、例外が発生します。

List<IA> list = library.Get();
IDataReader r = ObjectReader.Create(list, nameof(IA.A), nameof(IA.B));
while (r.Read())
{
    for (Int32 i = 0; i < r.FieldCount; i++)
    {
        //HERE ArgumentOutOfRangeException: Specified argument was out of the range of valid values.Parameter name: name
        Object o = r[i];
        Console.Write(o + ",");
    }
    Console.WriteLine();
}

BIBで宣言されているため、プロパティが見つからないようです。私はテストを行い、B をIA直接入れることでこれを確認しました。

IA を実装する新しいクラスを作成することを含む、非常に悪い回避策を見つけました。

public class Ab : IA
{
    public Ab(String a, String b)
    {A = a;B=b;}

    public String A { get;}
    public String B { get;}
}

を次のように変換しList<IA>ます: List<Ab> newList = l.Select(e => new Ab(e.A, e.B).ToList()、次にObjectReader.Create(newList). これを行うと、ObjectReader はBプロパティを見つけるようです。しかし、まったく同じ内容のこの中間オブジェクトを作成するには、リソース (および多くのコード) が非常に無駄に思えます。

新しいオブジェクトの作成を伴わない別の方法で解決できるかどうか、考えはありますか?

4

1 に答える 1