2014-01-20 3 views
0

Я проектирую 3-слойный каркасКак передать атрибуты объекта в качестве параметров функции?

Я хотел бы знать, можно ли передавать атрибуты объекта функции, не декларируя их явно? Например если я хочу передать Id,Name в personnelBL.ValidateInsert(...)

Я не хочу ValidateInsert функции интерфейса выглядеть следующим образом: ValidateInsert(Id,Name)

Причиной этого является то, что я хочу написать базовый абстрактный класс, чтобы содержать ValidateInsert(...) абстрактная функция, поэтому я наследую этот класс в своих классах BL Layer и если входные параметры ValidateInsert могут быть объявлены таким образом, что я мог бы передать атрибуты объектов в общем виде. Было бы очень приятно.

Примечание. Кто-то может сказать, что я могу передать объект функции с помощью дженериков, но я действительно не хочу передавать объект! Я хочу передать атрибуты любого объекта, чтобы я мог наследовать этот абстрактный базовый класс в любых классах entityBL.

Я действительно не мог объяснить, что я хочу лучше! Извините за это и спасибо, что поняли меня.

+0

насчет объявить свой базовый метод, как: Подтвердить (словарь <строка, строка> aValuesToCheck). Не дает вам безопасности типа, но является способом общего пропускания произвольного количества значений атрибутов. – TheEdge

+0

@ TheEdge Что вы говорите - это действительно хороший способ! и тип safty не важен, потому что я проверяю типы и значения в DAL Layer. Я обязательно попробую, что вы сказали. Но было бы очень хорошо, если бы был лучший способ передать какие-либо объекты, атрибуты;) – Karamafrooz

+0

Проверьте мой ответ. Я предлагаю набрав безопасный способ для этого, но я не уверен, как вы это реализуете. –

ответ

1

не уверен, что я полностью понимаю, что вы хотите, но я думаю, что ниже может помочь

  1. Вы можете использовать reflection.You можно избежать проблем с производительностью, это создать метод на класс на лету и компиляции он (может использовать дерево выражений компиляции). и добавьте свой собственный атрибут, который вы помещаете только по соответствующим атрибутам.
  2. Создайте интерфейс, он может вернуть словарь имени столбца и его значений. ваш абстрактный класс будет реализовывать этот интерфейс.

надеюсь, что это ответ на ваш вопрос

+0

не могли бы вы предоставить мне простой пример кода для второго упоминания? – Karamafrooz

+0

должно быть простым. не могли бы вы подробнее рассказать о своем ValidateInsert? что он должен делать? мог ли он получить словарь? – Mzf

1

Ну, не совсем.

Но вы можете быть очень близки к!

Вы можете использовать Expression API. Это потрясающе. Код, который я выложу здесь, просто псевдокод, но вы получите эту идею. Я не буду беспокоиться о синтаксисе, но я постараюсь сделать все возможное.

public static bool ValidateInsert(params Expression<Func<object,object>>[] properties) 
{ 

    //Here you'll do some code to get every property. You can do a foreach loop. 
    //I think you will need to use reflection to get the property values 

} //Change Func<Object,Object> accordingly. This represents a function that takes an object and returns another object. 

Вот как вы можете добиться синтаксиса, но я не уверен в функциональности. Вам понадобится объект «instance», из которого вы получите значения свойств.

Таким образом, вы могли бы назвать это так:

ValidadeInsert(x => x.Id, x => x.Name, x => x.Whatever)

Here вы можете увидеть, как получить метод добытчик свойства. Я думаю, вы можете получить PropertyInfo из выражения лямбда, но я не уверен. Вам нужно будет провести некоторое исследование и адаптировать его к вашему коду, если вы решите следовать этому пути.

Извините за мой английский, но я думаю, вы поняли, что я имел в виду.

1

Я не уверен, если я правильно понимаю ваш вопрос, но вы ищете что-то похожее на this-

public class Base<T, TFiled> 
{ 
     public void ValidateInsert(TFiled filed) 
     { 

     } 
} 

public class Derived : Base<Derived, long> 
    { 
     public long Id { get; set; } 
    } 

    public class AnotherDerived : Base<Derived, string> 
    { 
     public string IdSring { get; set; } 
    } 


    public class MyObject 
    { 
     private Derived d = new Derived(); 

     private AnotherDerived anotherIsntance = new AnotherDerived(); 

     public MyObject() 
     { 
      d.ValidateInsert(10); 
      anotherIsntance.ValidateInsert("some string"); 
     } 

    } 
Смежные вопросы