我有一个ASP.NET MVC应用程序是用C#编写的。我的应用程序有一个非常具体的一次性扩展方法。目前,我的扩展方法如下所示
public static MvcHtmlString CreateControl<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> items, object htmlAttributes = null)
{
var name = ExpressionHelper.GetExpressionText(expression);
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var model = htmlHelper.ViewData.Model;
...
int i = 0;
i = i + 1;
}我在Visual中的“int i = 0;”窗口中设置了一个断点,可以看到model中的值列表。model有一个名为"MyValue“的属性。虽然我可以在“监视”窗口中看到它,但我不知道如何从代码中获得"MyValue“的值。model是TModel。我似乎不能对它进行类型转换。此外,我没有看到一个助手函数或任何东西。
如何从TModel对象获取属性值?
发布于 2015-02-17 14:50:00
模型是一个
TModel
TModel不是一个类型--它是一个泛型参数。扩展方法是通用的,这意味着它可以与任何类型的模型一起运行。编译器无法在编译时知道模型有哪些属性,所以在编译时没有反射、转换或动态就无法访问它们,所有这些都不是运行时安全的。
我的应用程序有一个非常具体的一次性扩展方法。
不,这种方法是通用的。它可以适用于任何类型的模型。如果希望它特定于一种模型类型,那么就不要泛化模型类型:
V----- specific type ----------------V
public static MvcHtmlString CreateControl<TValue>(this HtmlHelper<MyModel> htmlHelper, Expression<Func<MyModel, TValue>> expression, IEnumerable<SelectListItem> items, object htmlAttributes = null)
{
var name = ExpressionHelper.GetExpressionText(expression);
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var model = htmlHelper.ViewData.Model;
...
int i = 0;
i = i + 1;
}发布于 2015-02-17 14:52:32
您似乎有一个类型的TModel,它每次都要求它具有相同的属性。我将使所有这些类型都实现一个接口,并添加如下约束:
public interface IMyModel
{
MyValue { get; set; }
}现在添加约束:
public static MvcHtmlString CreateControl<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> items, object htmlAttributes = null)
where TModel : IMyModel
{
var myModel = (IMyModel)htmlHelper.ViewData.Model;
//Now you can read the property:
var value = myModel.MyValue;
}https://stackoverflow.com/questions/28564035
复制相似问题