C#中的多个重载扩展方法

时间:2014-11-25 20:18:58

标签: c# extension-methods asp.net-core

使用重载扩展方法设置数据时遇到问题 -

我有两种扩展方法:

public static void Fill(this SearchRequest request, ISearchViewModel vm)
{
    request.blabla = vm.blabla;
}

public static void Fill(this IEnumerable<IViewModel> response, SearchResponse searchResponse)
{
 // a list is created here and assigned to response
  List<IViewModel> someResults = new List<IViewModel>();
 // do stuff with search response and someResults
 response = someResults;
}

我先致电:

 SearchRequest request = new SearchRequest ();
 request.Fill(criteria);

和request.blabla按预期设置。到目前为止一切都很好。

然后我尝试:

ResultViewModel result = new ResultViewModel ();
result.searchResult.Fill(searchResponse);

.searchResult是IViewModel的IEnumerable,但在调用Fill行之后,result.searchResult为null。填充扩展方法肯定被调用,并且肯定是设置数据。

对于可能出现的问题的任何想法将不胜感激。

(我正在使用VS 2015,这是一个vNext项目 - 没有那些不是真正的变量/类名)

3 个答案:

答案 0 :(得分:3)

responseresult.searchResult,它不是变量的别名。将值设置为response不会改变result.searchResult。无法编写通过引用而不是按值传递其隐式参数的扩展方法。

答案 1 :(得分:0)

IEnumerables是不可变的。也许你可以将类型更改为像List一样可变的东西?

答案 2 :(得分:0)

您可以使用此代码代替您的代码:

void Main()
{
    var f=new Foo();
    f.FillMyList();
}

public class Foo
{
    public List<string> MyList { get; set; }
}

public static class extensions
{
    public static void FillMyList(this Foo f)
    {
        f.MyList=new List<string>();
        f.MyList.Add("some item");
    }
}