您好,登錄后才能下訂單哦!
小編給大家分享一下Java中用表達(dá)式數(shù)調(diào)用的實(shí)例代碼,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
利用表達(dá)式樹構(gòu)建委托改善反射性能 做了一點(diǎn)小更改正好適合自己用
public static class DynamicMethodBuilder {public static Delegate BuildDynamicDelegate(MethodInfo methodInfo, ConstructorInfo constructorInfo = null) {if (methodInfo == null)throw new ArgumentNullException("methodInfo"); List<ParameterExpression> paramExpressions = methodInfo.GetParameters().Select((p, i) =>{var name = "param" + (i + 1);return Expression.Parameter(p.ParameterType, name); }).ToList(); MethodCallExpression callExpression;if (methodInfo.IsStatic) {//Call(params....)callExpression = Expression.Call(methodInfo, paramExpressions); }else{if (constructorInfo != null) {//Instance(params).Call(params....)List<ParameterExpression> constructorParamExpressions = constructorInfo.GetParameters().Select((p, i) =>{var name = "constparam" + (i + 1);return Expression.Parameter(p.ParameterType, name); }).ToList(); callExpression = Expression.Call(Expression.New(constructorInfo, constructorParamExpressions), methodInfo, paramExpressions); paramExpressions.InsertRange(0, constructorParamExpressions); }else{ callExpression = Expression.Call(Expression.New(methodInfo.ReflectedType), methodInfo, paramExpressions); } }return Expression.Lambda(callExpression, paramExpressions).Compile(); } }
測(cè)試:
public class Baby { private readonly DateTime _birthDay; public Baby(DateTime birthDay) { _birthDay = birthDay; } public Baby() { _birthDay = DateTime.Now; } public string GetBabyInfo(string name, int sex) => $"姓名:{name} , 出生天數(shù):{ DateTime.Now- _birthDay} ,性別 :{(sex == 1 ? "男" : "女")}"; } class Program { static void Main(string[] args) { Type targetType = Assembly.GetExecutingAssembly().GetType("ConsoleApplication1.Baby"); MethodInfo methodInfo = targetType.GetMethod("GetBabyInfo", new[] { typeof(string), typeof(int) }); ConstructorInfo constructor = targetType.GetConstructor(new[] { typeof(DateTime) }); WithConstructor(methodInfo, constructor); WithOutConstructor(methodInfo); Console.ReadKey(); } static void WithConstructor(MethodInfo methodInfo, ConstructorInfo constructor) { var func = (Func<DateTime, string, int, string>)DynamicMethodBuilder.BuildDynamicDelegate(methodInfo, constructor); Console.WriteLine(func(DateTime.Now.AddDays(-100), "糖墩兒", 1)); } static void WithOutConstructor(MethodInfo methodInfo) { var func = (Func<string, int, string>)DynamicMethodBuilder.BuildDynamicDelegate(methodInfo); Console.WriteLine(func("糖墩兒", 1)); } }
看完了這篇文章,相信你對(duì)Java中用表達(dá)式數(shù)調(diào)用的實(shí)例代碼有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。