如何将对象属性作为函数参数传递?

时间:2014-01-20 11:15:46

标签: c# frameworks

我正在设计一个3层框架

我想知道是否可以将对象的属性传递给函数而不明确声明它们? 例如,如果我想将Id,Name传递给personnelBL.ValidateInsert(...)

我不希望ValidateInsert函数界面如下所示:ValidateInsert(Id,Name)

原因是我想编写一个基本抽象类来包含ValidateInsert(...) 抽象函数所以我将在我的BL Layer类中继承该类,并且如果ValidateInsert输入参数可以以一种我可以以一般形式传递对象属性的方式声明它真的很好。

注意:有人可能会说我可以使用泛型将对象传递给函数,但我真的不想传递对象!我想传递任何对象的属性,所以我可以在任何entityBL类中继承该抽象基类。

我真的无法解释我想要的更好!对不起,感谢您的理解。

3 个答案:

答案 0 :(得分: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.

这是你如何实现语法,但我不确定功能。 您将需要一个“实例”对象,您将从中获取属性值。

所以,你可以这样称呼它:

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

Here您可以看到如何获取属性的Getter方法。我想你可以从lambda表达式中获取PropertyInfo,但我不确定。如果您决定采用这种方式,则必须进行一些研究并使其适应您的代码。

对我的英语很抱歉,但我想你明白我的意思。

答案 1 :(得分:1)

不确定我完全理解你想要什么,但我认为以下内容可以帮助

  1. 你可以使用反射。你可以避免性能问题,你是动态创建每个类的方法并编译它(可以使用编译表达式树)。并添加您自己的属性,只放在相关的属性上。
  2. 创建一个接口,它可以返回列名及其值的字典。你的抽象类将实现这个接口。
  3. 希望这能回答你的问题

答案 2 :(得分:1)

我不确定我是否正确理解你的问题,但你是否正在寻找类似的东西 -

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

    }