2017-05-09 53 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