2 votes

Le constructeur ne peut pas accepter le type d'entrée Expression<Func<T, TResult>> en C#

Je veux créer la classe Foo comme suit. L'expression d'entrée du constructeur de Foo permet d'obtenir un membre de type T pour effectuer un certain travail.

class Foo<T>
{
    public Foo<TResult>(Expression<Func<T, TResult>> selector)
    {
         List<string> memberNames = typeof(TR).GetProperties().Select(p => p.Name).ToList();
         ....//some work on memberNames 
    }
}

et Créer une instance de Foo par le code :

Foo<ClassA> foo = new Foo<ClassA>(u=>new{u.Property1, u.Property2});

mais cela n'a pas fonctionné. Le constructeur ne peut pas avoir le type Generc TResult. Comment faire ?

Après avoir lutté contre l'expression, j'ai trouvé la réponse et je l'ai inscrite dans les réponses.

4voto

Evk Points 17804

Vous pouvez déplacer la logique à l'extérieur du connecteur dans une méthode séparée. Au lieu d'utiliser un constructeur pour créer Foo, vous pouvez utiliser une méthode statique, comme celle-ci :

class Foo<T> {
    private Foo() {

    }

    private void Init<TResult>(Expression<Func<T, TResult>> selector) {
        List<string> memberNames = typeof(TResult).GetProperties().Select(p => p.Name).ToList();
        //some work on memberNames 
    }

    public static Foo<T> Create<TResult>(Expression<Func<T, TResult>> selector) {
        var foo = new Foo<T>();
        foo.Init(selector);
        return foo;
    }
}

Et utilisez-le comme suit :

Foo<ClassA> foo = Foo<ClassA>.Create(u=>new{u.Property1, u.Property2});

-1voto

Hossein Razzaghi Points 43

Je résous le problème comme suit

class ClassA
{
    public int MyProperty { get; set; }
    public int MyProperty2 { get; set; }
}    
class Foo<T>
{
    public Foo(Expression<Func<T, Object>> selector)
    {
        var props = ((NewExpression)selector.Body).Members.Select(p => p.Name).ToList();
    }
}

Foo<ClassA> foo = new Foo<ClassA>(u => new { u.MyProperty, u.MyProperty2 });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X