我正在为IEnumerable编写一个通用扩展方法,用于将对象列表映射到另一个映射对象列表.这就是我希望该方法工作的方式:
IList<Article> articles = GetArticles();
return articles.Map<ArticleViewModel>(_mappingEngine);
Run Code Online (Sandbox Code Playgroud)
这是方法:
public static IEnumerable<T2> Map<T1, T2>(this IEnumerable<T1> list, IMappingEngine engine)
{
return list.Select(engine.Map<T1, T2>);
}
Run Code Online (Sandbox Code Playgroud)
但是articles.Map<ArticleViewModel>(_mappingEngine); 会出现编译错误.问题是T1的类型推断不起作用.我必须明确地这样称呼它:
articles.Map<Article, ArticleViewModel>(_mappingEngine);
Run Code Online (Sandbox Code Playgroud)
如果我创建一个只有一个参数T1的扩展方法,如下所示:
public static IEnumerable<T1> DummyMap<T1>(this IEnumerable<T1> list, IMappingEngine engine)
{
return list;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样调用它,而不必指定T1:
articles.DummyMap(_mappingEngine);
Run Code Online (Sandbox Code Playgroud)
有没有理由说编译器无法在Map的扩展方法中推断出T1的类型?
我们在 VS2005 中构建了一个相当大的 C++ 项目,从头开始编译和构建可能需要长达 40 分钟的时间,安装程序还需要 10 分钟,因为该软件是在 32 位和 64 位配置中构建的。我希望将这个时间减少到至少 10 分钟左右,因为我觉得在使用持续集成时获得快速构建反馈很重要。
当通过删除最终链接文件而不是 .obj 文件来使用增量构建时,构建过程似乎要快得多,但似乎会到处弹出错误,例如无法加载 .dll。从干净的构建开始一切正常。我选择使用 TeamCity 作为 CI 系统。
也许增量构建行为在 Visual Studio 的更高版本中更好,并且可能是升级的良好动力?有人遇到过类似的问题吗?
使用ASP.NET MVC 3,我一直在努力为强类型视图使用帮助Html.DropDownListFor()函数设置下拉列表的选定值.
模型的代码如下所示:
public class ResourceView
{
...
public Language Language { get; set; }
}
public class Language
{
public string DisplayName { get; private set; }
public string Code { get; private set; }
public override string ToString() { return DisplayName; }
}
Run Code Online (Sandbox Code Playgroud)
并在视图内:
@Html.DropDownListFor(model => model.Language,
new SelectList(ViewBag.AllPossibleLanguages,
"Code", "DisplayName", Model.Language.Code))
Run Code Online (Sandbox Code Playgroud)
有一些解决方法,例如使用
@Html.DropDownList("LanguageCode",
new SelectList(ViewBag.PossibleLanguages,
"Code", "DisplayName", Model.Language.Code))
Run Code Online (Sandbox Code Playgroud)
而且奇怪的是,如果第一个参数设置为"语言",则上述代码将不起作用,与模型中属性的名称相同.
我也可以这样做
@Html.DropDownListFor(model => model.Language,
new SelectList(ViewBag.AllPossibleLanguages))
Run Code Online (Sandbox Code Playgroud)
它将与适当的选定值一起工作,但是只会显示Language类的ToString()值,并且不会设置我想要的选项标签中的实际语言代码,这并不奇怪,因为它有没有任何标识可以将Code字段用作value属性.
我也可以使用jquery事件处理程序来解决这个问题,该事件处理程序之后会选择适当的值.但是我很好奇为什么这不能按预期工作,并且如果可能的话想要正确地解决它.
我正在寻找一个很好的资源,它非常详细地描述了模型绑定如何与ASP.NET MVC 3(或在较小程度上,MVC 2)和不同方法一起工作.我没有找到关于这个主题的任何好资源,除了那里的点点滴滴.网上的信息更多地是关于"如何做X"而不是解释模型绑定的内部如何工作.有什么建议?书籍推荐也很好.
我dynamic在视图模型中使用对象,因为我发现使用 Automapper 之类的东西不必要的开销,并且发现这种方法更加灵活和轻量级。我正在使用来自即兴界面的构建器,如下所示:
private dynamic New = Builder.New();
private dynamic GetViewModel(Product p)
{
var viewModel = New.Product( id : p.Id, name : p.Name );
viewModel.AdditionalProperty = "some additional data";
return viewModel;
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,“扩展”实际对象会比逐一重新映射所有属性更好,类似于在 JavaScript 中使用jQuery.extend()
private dynamic GetViewModel(Product p)
{
var viewModel = //create base dynamic object, that has all the members of p.
viewModel.AdditionalProperty = "some additional data";
return viewModel;
}
Run Code Online (Sandbox Code Playgroud)
这应该可以通过ExpandoObject结合反射和迭代所有成员来实现,但我想知道是否有更干净/更整洁的解决方案。