【问题标题】:How to pass object attributes as function parameters?如何将对象属性作为函数参数传递?
【发布时间】:2017-07-28 22:31:49
【问题描述】:

我正在设计一个 3 层框架

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

我不希望ValidateInsert 函数界面看起来像这样:ValidateInsert(Id,Name)

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

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

我真的无法解释我想要什么更好!很抱歉,感谢您理解我。

【问题讨论】:

  • 如何将您的基本方法声明为:Validate(Dictionary aValuesToCheck)。不会为您提供类型安全性,但它是一种通常传递任意数量的属性值的方法。
  • @TheEdge 你说的真是个好方法!并且类型安全并不重要,因为我检查了 DAL Layer 中的类型和值。我一定会试试你说的。但是,如果有更好的方法来传递任何对象属性,那就太好了;)
  • 看看我的回答。我提供了一种类型化的 ans 安全方法来执行此操作,但我不确定您将如何实现它。

标签: c# frameworks


【解决方案1】:

不确定我是否完全理解您想要什么,但我认为以下内容可以提供帮助

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

希望这能回答你的问题

【讨论】:

  • 能否请您为我提供您提到的第二种方式的简单示例代码?
  • 应该很简单。你能解释一下你的 ValidateInsert 吗?它应该做什么?它可以接收字典吗?
【解决方案2】:

我不确定我是否正确理解了您的问题,但您是否正在寻找与此类似的内容-

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

    }

【讨论】:

    【解决方案3】:

    嗯,不是真的。

    但你可以非常接近!

    您可以使用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 =&gt; x.Id, x =&gt; x.Name, x =&gt; x.Whatever)

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

    对不起我的英语,但我想你明白我的意思。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      相关资源
      最近更新 更多