2017-10-10 49 views
1

我試圖從外面發送兩個選擇參數給一個函數。我試圖實現低於發送功能之外的選擇參數?

我有一個這樣的模型簡化,

public class Entity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

SampleData: 
3/Barrack/Obama 
4/Vladimir/Putin 

和另一個模型

public class IdTextModel 
{ 
    public string Id { get; set; } 
    public string Text { get; set; } 
} 

,我想創建這樣的功能

public List<IdNameModel> GetList(propselectorA, propselectorB){ 
    return data.Select(x => new IdTextModel(){ 
     Id = propselectorA, 
     Text = propselectorB 
    }); 
} 

用法:

var list = GetList(x => x.Id, x => x.Surname); 

ExpectedResult: 
3/Obama 
4/Putin 

我該如何做到這一點?謝謝。

+0

我相信你正在尋找的類型是'Expression >' – juharr

回答

1

您可以使用Expression<Func<Entity,IdNameModel>>抽象出來的各類IdText

public List<T> GetList(
    Expression<Func<Entity,T>> selector 
) { 
    return data.Select(selector).ToList(); 
} 

,並調用它像這樣:

var list = GetList(x => IdTextModel { Id = x.Id, Name = x.Surname }); 

傳遞選擇了兩個字符串屬性也是可以的,但使用Zip使其效率更低:

public List<IdTextModel> GetList(
    Expression<Func<Entity,string>> selectorId 
, Expression<Func<Entity,string>> selectorName 
) { 
    return data 
     .Select(selectorId) 
     .Zip(
      data.Select(selectorName) 
     , (id, name) => new IdTextModel { Id = id, Name = name } 
     ).ToList(); 
} 
+0

謝謝你的快速回答。公開列表 GetList (表達式<功能>選擇器 ) { var data = new List (); 返回data.Select(選擇器); } –

+0

@ilkerunal'data'不應該是一個新的列表。我假設你有數據上下文可用,所以它應該是像'dataContext.EntityTable.Select(選擇器).ToList();' – dasblinkenlight

+0

你是燦爛的謝謝。 –