如果我有一個Expression<Func<Delegate>>
形式的表達式,可以確定用於傳遞委託的對象的派生的類型?這個表達是否包含這些信息,還是僅僅是代表的代表。從方法表達式獲取具體類型
一個代碼示例應該使事情更清晰。
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace Sandbox {
public interface IContract {
void Method();
}
public class Concrete : IContract {
public void Method() { }
}
public class Test {
private IContract contract = new Concrete();
private Concrete concrete = new Concrete();
public static string GetFullMethodName(Expression<Func<Action>> expression) {
var unaryExpression = (UnaryExpression)expression.Body;
var methodCallExpression = (MethodCallExpression)unaryExpression.Operand;
var methodInfoExpression = (ConstantExpression)methodCallExpression.Arguments.Last();
var methodInfo = (MemberInfo)methodInfoExpression.Value;
var type = methodInfo.DeclaringType;
var name = methodInfo.Name;
return String.Format("{0}.{1}", type, name);
}
public Test() {
var strConcrete = GetFullMethodName(() => concrete.Method); // Sandbox.Concrete.Method
var strContract = GetFullMethodName(() => contract.Method); // Sandbox.IContract.Method
}
}
}
是否有可能使() => contract.Method
產生
Sandbox.Concrete.Method
而不是
Sandbox.IContract.Method
可以改變表達式來支持這個表達式,還是我會被迫將對象的一個實例作爲單獨的參數傳遞以確定它的類型?
爲什麼你想這樣做嗎?有什麼幫助調試? – Luaan