2017-01-25 5 views
0

C#では、A、Aという形式の2つのクラスがあります。ここで、Aは参照型に対してカスタマイズされたIEnumerableであり、B、CはクラスDから継承する参照型です。B、Cに存在するPという名前のプロパティDから継承する他のクラスはPを持たないべきであるので、Dに追加することは不適切です。私は、A、Aのインスタンスb、cを持ちます。 Pと同じタイプ:このケースの繰り返しを減らすにはどうすればいいですか?

b.Where(v => v.P == x).ForEach(v => v.P = y); 
c.Where(v => v.P == x).ForEach(v => v.P = y); 

このコードは機能しますが、どのように私は繰り返すことを避けることができますか?ドライ原則? Pは1は、単にDとキャストすなわちのインスタンス上で動作する関数を作成することはできませんD上に存在しないので

  1. 私自身の努力は三つの主要な困難に遭遇しました。 b.Select(v =>(D)v)。 Pは、ジェネリック型には存在しませんので

  2. 、コンパイラはAのみTクラス、Aを使用してジェネリックがかかるため、一般的なT.

  3. でこのロジックを実行するための明確な方法を容認しませんTが参照型である必要があると不平を言う。

私は、このアプローチが可能であるべきことをお勧めしてきたように、Cは、継承することができたBから新しいインターフェイス上の汎用メソッドを作成するソリューションで、特に興味があります。

+0

クラスA、B、C、Dを定義するコードを追加してください。 – Sefe

+0

私はそれを行うことはできません。それは独占的だ。いずれにせよ、それは多くのコードになります。 –

+0

あなたの例を説明しました。それをコードで説明してください。 – Sefe

答えて

1

私の意見では、存在しない問題を解決したいと思います。それはあなたのクラス定義とはるかに簡単になりますが、あなたはこのような何かを行うことができます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     int x = 1; 
     int y = 2; 

     var b = new MyCustomList<B>(); 

     b.Foo(v => v.P == x, n => n.P = y); 
    } 
} 

public static class Extensions 
{ 
    public static void Foo<T>(this IFoo<T> @this, Func<T, bool> predicate, Action<T> action) => @this.Where(predicate).ToList().ForEach(action); 
} 

public interface IFoo<T> : IList<T> { } 

class MyCustomList<T> : List<T>, IFoo<T> { } 

class B 
{ 
    public int P { get; set; } 
} 
+0

'ForEach(...) 'を利用するために' ToList() 'を使用すると、私は震えます。代わりに 'foreach'ループを使わないのはなぜですか? LazyEvaluationが付いていて、annyにメモリを追加しない(ToListの配列) – CSharpie

1

私が正しくあなたを理解していた場合は、これに似た何かをしたい:

public interface IHasPropertyP { Foo P { get; } } 
public class B: D, IHasPropertyP { ... } 
public class C: D, IHasPropertyP { ... } 

List<D> dees = ... //I don't care if the type of the items is B, C or D 
var onlyThoseWhoHavePropertyP = dees.OfType<IHasPropertyP>(); 
onlyThoseWhoHavePropertyP.Where(v => v.P == x).{whatever needs to be done...} 
0

このコードは機能しますが、どのように私は反復を避けることができますか?ドライ原則?

あなたこの繰り返しを削除することができます - しかし、それはここであなたを得るかを検討 - 私は考えることができる少なくとも2つの方法があります。実行したい操作は、「XであるオブジェクトにPをYに設定」です。これは取得するだけで簡単ですが、隣り合わせに2本の平行な線があると、DRYer解決策はありません。

私は簡単に他の回答でカバーされていると考えることができますが、二つの方法:

  1. BCは、その後、実装するために作られて共通のインターフェースIHaveAPropertyPを作成します。 BC
  2. 上のコードの変更は、その型のオブジェクトのプロパティPをINGのgetティンとsetための方法と一緒に、任意のタイプのオブジェクトが渡される方法を持っている必要があります。これを受け、問題を複雑にする理由 -

いずれかの方法で、はまだ隣同士へのコードの2つの非常に類似した行があるでしょうか?

関連する問題