首页 / C# / c#-非泛型委托的适配器
c#-非泛型委托的适配器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-非泛型委托的适配器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1783字,纯文字阅读大概需要3分钟。
内容图文
![c#-非泛型委托的适配器](/upload/InfoBanner/zyjiaocheng/650/cb96dcb66c3f439bad9b2a7cae3ab716.jpg)
我有一个通用类:
public class ProviderAdapter<TDto, TModel>
{
public ProviderAdapter(IQueryable source, Func<TDto, TModel> mapping)
{
... //not important
}
}
和扩展方法:
public static class QueryableExtensions
{
public static IQueryable<TModel> Map<TDto, TModel>(
this IQueryable<TDto> query, Func<TDto, TModel> mapping)
{
var providerAdapter = new ProviderAdapter<TDto, TModel>(query, mapping);
var result = new QueryableAdapter<TModel>(providerAdapter);
return result;
}
}
现在,我想为非通用IQueryable创建另一个扩展方法:
public static class QueryableExtensions
{
public static IQueryable<TModel> Map<TModel>(
this IQueryable query, Func<dynamic, TModel> mapping)
{
//how to create ProviderAdapter instance having
//query.ElementType and mapping Func with dynamic?
var providerAdapter = new ProviderAdapter<type from query.ElementType, TModel>(query,
new Func<type from query.ElementType, TModel> using mapping Func<dynamic,TModel>
}
}
可能吗?我不确定’mapping’参数类型-我打算使用反射调用创建新的Func
Func<dynamic, TModel>
但是将第一个参数转换为query.ElementType.也许’mapping’参数应该是类型
Expression<Func<dynamic, TModel>>
解决方法:
如果我正确理解了您的问题,我会这样做:
public static class QueryableExtensions2
{
public static IQueryable<TModel> Map<TModel>(
this IQueryable query, Func<dynamic, TModel> mapping)
{
var tdto = query.ElementType;
var typedMapping =
typeof(QueryableExtensions2).GetMethod(nameof(Wrap))
.MakeGenericMethod(tdto, typeof(TModel))
.Invoke(null, new object[] { mapping });
var targetType = typeof(ProviderAdapter<,>)
.MakeGenericType(tdto, typeof(TModel));
var instance = Activator.CreateInstance(targetType,
new object[] { query, typedMapping });
return (IQueryable<TModel>)instance;
}
static public Func<TDto, TModel> Wrap<TDto, TModel>(Func<dynamic, TModel> mapping) =>
d => mapping(d);
}
内容总结
以上是互联网集市为您收集整理的c#-非泛型委托的适配器全部内容,希望文章能够帮你解决c#-非泛型委托的适配器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。