Найти способ повторно использовать мою функцию, которая меняется одним маленьким образом - PullRequest
0 голосов
/ 16 марта 2012

Итак, я пишу приложение на C #, используя .net / c # 4.0. У меня есть метод, который принимает пользовательский тип и словарь.Я использую это для разных целей, но по какой-то причине я не могу придумать способ инкапсулировать логику.Проблема в том, что эта строка

    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;
        }
    }
    }

Я продолжаю переписывать этот метод inline везде, где он мне нужен с надлежащим свойством .... это, очевидно, довольно расточительно, и любые изменения должны быть сделаны во многих местах.Заранее спасибо

Ответы [ 3 ]

1 голос
/ 16 марта 2012

Вы можете использовать выражение, а затем извлечь свойство в методе, а затем использовать отражение, чтобы связать его с объектом в методе

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 голос
/ 16 марта 2012

, чтобы решить проблему с доступом к различным свойствам и с использованием различных булевых функций (<,>, ==), вы можете использовать делегатов следующим образом:

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; }
    }
}
0 голосов
/ 16 марта 2012

Заставьте вашу функцию принять лямбда-аргумент и передать его _ => _.PropertyA, _ => _.PropertyB и т. Д..

...