c# – 有一种聪明的方法可以动态调用类型相关的扩展方法吗?

前端之家收集整理的这篇文章主要介绍了c# – 有一种聪明的方法可以动态调用类型相关的扩展方法吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
下面的代码将编译但在运行时失败.它只是为了让我知道我想要做什么.我想要做的是创建一个接受对象集合的方法(实际上是“无类型”集合),如果此集合由单个类型的数字组成,则使用Average()扩展方法返回平均值 @H_404_2@using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace nnConsole { class Program { static void Main(string[] args) { var ints = new object[4] { 1,2,3,4 }; var dbls = new object[4] { 1.0,2.0,3.0,4.0 }; Console.WriteLine(ReallyMean(ints)); Console.WriteLine(ReallyMean(dbls)); } static public double ReallyMean(ICollection<object> data) { var unique = data.Distinct(); var types = unique.Select(x => x.GetType()).Distinct(); if (types.Count() == 1) { if (types.First().IsValueType) { /*********************** * magic here to create ddata var that will * call the appropriate extension method for average */ dynamic ddata = data; // DOES NOT WORK return ddata.Average(); } } return double.NaN; } } }

我确信我可以使用反射来找到合适的Average方法调用它(不太漂亮).是否有更短/更清洁/更好的方法来做到这一点?我可以使用最新的C#和.NET运行时.

解决方法

由于你的代码总是返回一个double,你要找的是一个lambda,它将你的对象转换为double: @H_404_2@var res = data.Cast<dynamic>().Average(n => (double) n);

请注意,您的程序也可以在没有Cast< dynamic>()的情况下进行编译,但除非底层数据类型为double,否则它将在运行时失败.

原文链接:https://www.f2er.com/csharp/100069.html

猜你在找的C#相关文章