2017-05-09 85 views
4

的方法使用匿名类型我有我使用如下的OrderMapper类:在接受通用

OrderMapper<Post> m = OrderMapper.For<Post>().Add("title", x => x.Title); 

其中x是Post类型。问题是将其应用于匿名类型时。

var listOfAnonymousObjects = posts.SelectMany(x => x.PostsI18N, (Post, PostI18N) => new { Post, PostI18N }); 

OrderMapper<??> m = OrderMapper.For<??>().Add("title", x => x.Title); 

其中x必须是listOfAnonymousObjects中的AnonymousObject类型。我的OrderMapper代码是:

public class OrderMapper { 
    public static OrderMapper<T> For<T>() { 
    return new OrderMapper<T>(); 
    } 
} 

public class OrderMapper<T> { 

    private readonly Dictionary<String, LambdaExpression> _mappings = new Dictionary<String, LambdaExpression>(); 

    public OrderMapper<T> Add<K>(String source, Expression<Func<T, K>> target) { 

    if (!_mappings.ContainsKey(source)) 
     _mappings.Add(source, target); 
    return this; 
    } 

    public LambdaExpression this[String source] { 
    get { 
     LambdaExpression target; 
     return _mappings.TryGetValue(source, out target) ? target : null;   
    } 
    } // this 

} 

如何做到这一点?

+0

为什么不能用一个具体的类,而不是匿名之一? – juharr

+0

@亚历克斯:对不起?没有理解你的评论。 –

+0

诀窍是使用类型推断,而不是手动指定泛型类型参数。看看LINQ是怎么做到的:) – Luaan

回答

7

您可以利用类型推断,但这需要您传递一个实例。这可以这样做:

public static OrderMapper<T> ForFromEnumerable<T>(IEnumerable<T> dummy) 
{ 
    return new OrderMapper<T>(); 
} 

用法:

var m = OrderMapper.ForFromEnumerable(listOfObjectsOfTypeY).Add("title", x => x.Title); 
+0

就是这样。对于更清晰的实现,您可以将'ForFromEnumerable '变成扩展方法。 –

+0

@FedericoDipuma同意。 –

0

你好得多使用的具体类型 - 只要你的项目的匿名返回LINQ查询到具体的类型。

如果必须支持的话,你很可能将不得不诉诸dynamic

// no compile-time checking here. 
OrderMapper<dynamic> m = OrderMapper.For<dynamic>().Add("title", x => x.Title); 
+1

我讨厌'动态'。 :) –

+0

@PatrickHofman我也是! – Jamiec