2015-10-28 5 views
0

Глядя на деревья выражений на C# и читал this article.Expression.New (..) - но у меня уже есть объект

// Add the following directive to your file: 
// using System.Linq.Expressions; 
public class SampleClass 
{ 
    public int AddIntegers(int arg1, int arg2) 
    { 
     return arg1 + arg2; 
    } 
} 

static public void TestCall() 
{ 
    // This expression represents a call to an instance method that has two arguments. 
    // The first argument is an expression that creates a new object of the specified type. 
    Expression callExpr = Expression.Call(
     Expression.New(typeof(SampleClass)), 
     typeof(SampleClass).GetMethod("AddIntegers", new Type[] { typeof(int), typeof(int) }), 
     Expression.Constant(1), 
     Expression.Constant(2) 
     ); 

    // Print out the expression. 
    Console.WriteLine(callExpr.ToString()); 

    // The following statement first creates an expression tree, 
    // then compiles it, and then executes it. 
    Console.WriteLine(Expression.Lambda<Func<int>>(callExpr).Compile()()); 

    // This code example produces the following output: 
    // 
    // new SampleClass().AddIntegers(1, 2) 
    // 3 
} 

Я хочу сделать что-то почти идентичное это, только я не хочу, чтобы создать новый экземпляр SampleClass - У меня уже есть экземпляр, я просто хочу, чтобы вызвать метод на него.

Код по существу делает это:

new SampleClass().AddIntegers(1, 2) 

... используя деревья выражений; однако, я хочу это сделать:

sampleClassInstance.AddIntegers(1, 2) 

Это что-то я могу сделать, или я должен просто придерживаться рефлексии для этого?

+2

Конечно, вы можете просто заменить выражение для создания экземпляра с выражением, чтобы использовать существующий экземпляр. Какие проблемы вы делаете? Кроме того, пожалуйста, включите все соответствующие детали * в сам вопрос *. Люди не должны читать ссылку, чтобы понять ваш вопрос. – Servy

+0

Спасибо за ответ Servy. Каков синтаксис для этого? – garryp

+1

Это то же самое, что и синтаксис для создания выражения на основе любого другого значения, которое у вас есть, которое показано прямо в статье, на которую вы ссылались. – Servy

ответ

2

Вы можете сделать это:

public class SampleClass 
{ 
    public int AddIntegers(int a, int b) 
    { 
     return a + b; 
    } 
} 

var sampleClass = new SampleClass(); 
Expression callExpr = Expression.Call(
    Expression.Constant(sampleClass), 
    typeof(SampleClass).GetMethod("AddIntegers", new Type[] { typeof(int), typeof(int) }), 
    Expression.Constant(1), 
    Expression.Constant(2) 
    ); 
+0

Спасибо. Это именно то, что я искал. – garryp

Смежные вопросы