2014-01-20 167 views
0

我正在设计一个3层框架如何将对象属性作为函数参数传递?

我想知道是否有可能将对象的属性传递给函数而无需明确声明它们? 例如,如果我想通过Id,NamepersonnelBL.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. 

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

所以,你可以这样调用它:

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

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

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

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

    } 
相关问题