2012-03-16 5 views
0

.net/c#4.0を使用してC#アプリケーションを作成しています 私はカスタムタイプと辞書を取り入れたメソッドを持っています。 私はこれをさまざまなことに再利用していますが、何らかの理由でロジックをカプセル化する方法を考えることができません。このライン別でちょっと変わった機能を再利用する方法を見つける

if (FastIntParse.FastParse(_dict[_Rule.Key].hourly_data[a].PropertyA) > 
_Rule.Value) 

はそれが

if (FastIntParse.FastParse(_dict[_Rule.Key].hourly_data[a].PropertyB) > 
_Rule.Value) 

かもしれ問題を使用している様々なケースで変化する唯一の事は、私はルール値と比較するために使用していますプロパティです。何らかの理由で、再利用の方法を考えることができません。値が関数内で導出されるため、関数に渡す値がないためです。どのようにしてその情報を派生させて渡す必要があるかを知る必要性を抽象化する関数を書くことができます。つまり、そのプロパティの値ではなく、チェックする必要のあるプロパティを渡します。私は、適切なプロパティとそれを必要な場所、このメソッドをインライン書き換え保つ

int a; 
    for (int z= 0;z<=2;z++) 
    { 
    a = (z * z) * 24; 
    for (; (a%24) <= _Rule.AlertEndTime; a++) 
    { 
     if (FastIntParse.FastParse(_dict[_Rule.Key].hourly_data[a].PropertyA) > 
_Rule.Value) 
     { 

      EnqueueRuleTrigger(_Rule); 
      break; 
     } 
    } 
    } 

....これは明らかに、非常に無駄であり、任意の変更は、多くの場所で行われる必要があります。事前

+0

をする場合には、私は明確ではないです、私もOBを持っていませんループ外のプロパティの参照を取得します。私はループロジック[変更されていない]とメソッドにカスタムプロパティを提供する機能を含むものをカプセル化したいと思います。私が4つの条件を持っていれば、それらが評価するプロパティを除いて全く同じです。このコード全体をコピーして貼り付け、プロパティ参照を変更しています。それらの4つのそれぞれが3つの亜種を持っています。一つは、>、a <とan =を使います。このメソッドを12回少し修正しました。 – Jordan

答えて

0

で おかげであなたは、同じロジックでご確認ください。この機能は、一般的なようにするオブジェクトの多くの種類を持っている場合は、あなたの関数は、_ => _.PropertyB等:

void CheckAndEnqueueRulesByProperty (Func<YourObject, string> propertyGetter) 
{ 
    ... 
    if (FastIntParse.FastParse (propertyGetter (
      _dict[_Rule.Key].hourly_data[a])) > _Rule.Value) 
    { 
     ... 
    } 
    ... 
} 

をラムダ引数を取り、それを_ => _.PropertyAを渡してください。

+0

PropertyAとPropertyBは配列内のオブジェクトのプロパティであるため、私がループに入るまで_にアクセスすることはできません[辞書内]誰がインデックスにいるのですか?この全体がインラインで貼り付けられる「機能」です。私は基本的に、まだ私が参照していないオブジェクトのプロパティを使用するように伝えることができる関数を作成したいと思います。そのプロパティ参照は、呼び出し側から渡される必要があります。あなたの答えがこの申し訳ありませんをカバーした場合、私は少し私はLambdasに新しいです.... – Jordan

1

あなたはアクセスの問題を解決するためのメソッド内のオブジェクトにこれをタイアップする

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<PropertyBag> bags = new List<PropertyBag>() 
            { 
             new PropertyBag() {Property1 = 1, Property2 = 2}, 
             new PropertyBag() {Property1 = 3, Property2 = 4} 
            }; 

     Runme(x => x.Property1, bags); 
     Runme(x => x.Property2, bags); 

     Console.ReadLine(); 


    } 

    public static void Runme(Expression<Func<PropertyBag, int>> expression, List<PropertyBag> bags) 
    { 
     var memberExpression = expression.Body as MemberExpression; 
     var prop = memberExpression.Member as PropertyInfo; 

     bags.ForEach(bag => 
       Console.WriteLine(prop.GetValue(bag, null)) 
      ); 
    } 
} 


public class PropertyBag 
{ 
    public int Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

}

1

をリフレクションを使用し、その後、式を使用して、メソッド内でプロパティを引き出すことができます異なる特性に異なるブール関数の使用(<、>、==)あなたはこのように、デリゲートを使用することができて:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    delegate bool CompareFunction(Fii test, Foo item); 

    class Program 
    { 
     static List<Foo> list = new List<Foo>() { 
      new Foo() { PropertyA = 0, PropertyB = 9 }, 
      new Foo() { PropertyA = 1, PropertyB = 10 } 
     }; 
     static Fii test = new Fii() { PropertyA = 1 }; 

     static void Main(string[] args) 
     { 
      Bar(list, delegate(Fii item1, Foo item2) { return item2.PropertyA < item1.PropertyA; }); 
      Bar(list, delegate(Fii item1, Foo item2) { return item2.PropertyB > item1.PropertyA; }); 
      Bar(list, delegate(Fii item1, Foo item2) { return item2.PropertyA == item1.PropertyA; }); 
      Console.ReadLine(); 
     } 

     static void Bar(List<Foo> list, CompareFunction cmp) 
     { 
      foreach (Foo item in list) 
       if (cmp(test, item)) 
        Console.WriteLine("true"); 
       else 
        Console.WriteLine("false"); 
     } 
    } 

    class Foo 
    { 
     public int PropertyA { get; set; } 
     public int PropertyB { get; set; } 
    } 

    class Fii 
    { 
     public int PropertyA { get; set; } 
    } 
} 
関連する問題