2013-10-10 18 views
2

我有以下的抽象类如何与给定的表达式访问属性

abstract public class FooActivator<T> where T : class 
{ 
    protected static Expression<Func<Foo, Bar<T>>> ChosenProperty 

    public void Activate(T Paramater) 
    { 
     using (var foo = new Foo) 
     { 
      foo.ChosenProperty.Method(Paramater) //Obviously wrong, How do you do this? 
     } 
    } 
} 

的想法是,我能继承这个基类,以便分配新的价值ChosenProperty告诉Activate哪个属性调用该方法。

Public Class MyClassFooActivator : FooActivator<MyClass> 
{ 
    new static Expression<Func<Foo, Bar<MyClass>>> ChosenProperty = x => x.PropertyOfTypeBarMyClass 
} 

现在Activate(MyClass Paramater)是准备好被调用,它会使用

foo.PropertyOfTypeBarMyClass.Method(Paramater) 

,因为这是包含在表达式中的属性调用它。

很显然,我不能这样做foo.ChosenProperty.Method(Paramater),因为ChosenPropertyExpression类型的变量,但什么是选择已经通过表达选择的foo任何属性的语法?

+0

您正在访问ChosenProperty该属性需要公开,但在自其静态实例级别的方式。 – terrybozzio

+0

我认为你比这应该更复杂。你为什么不告诉我们你一般想要达到什么目标?相关的类名也会有帮助。 –

+0

试试看这里http://stackoverflow.com/questions/10193453/how-can-i-pass-a-property-in-via-a-lambda-expression?rq=1 –

回答

3

我想你要寻找的可能是这样的:

abstract class FooActivator<T> where T : class 
{ 
    protected abstract Func<Foo, Bar<T>> ChosenProperty { get; } 

    public void Activate(T param) 
    { 
     var foo = new Foo(); 
     ChosenProperty(foo).Method(param); 
    } 
} 

class MyClassFooActivator : FooActivator<MyClass> 
{ 
    protected override Func<Foo, Bar<MyClass>> ChosenProperty 
    { 
     get { return x => x.SomeBarMyClassProperty; } 
    } 
} 
+0

是的!这正是我所期待的。需要放弃'表达式'并使用'Func'。谢谢! – JHixson