Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过作为字符串传递的名称引用c对象字段_C#_Asp.net_Asp.net Mvc 4 - Fatal编程技术网

C# 通过作为字符串传递的名称引用c对象字段

C# 通过作为字符串传递的名称引用c对象字段,c#,asp.net,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc 4,我正在用ASP.NETMVC在C中编写一个自定义报告模块 用户将能够定义他们希望在报告中看到的字段列表 我想知道是否可以使用字符串引用对象字段,以便我可以枚举所选字段的列表 例如,通常在视图中,基本上我会执行以下操作 @foreach (Title item in Model) { @item.Name @item.Isbn } 我会找类似的东西 @foreach (Title item in Model) { @item.Select("Name") @it

我正在用ASP.NETMVC在C中编写一个自定义报告模块

用户将能够定义他们希望在报告中看到的字段列表

我想知道是否可以使用字符串引用对象字段,以便我可以枚举所选字段的列表

例如,通常在视图中,基本上我会执行以下操作

@foreach (Title item in Model)
{
    @item.Name 
    @item.Isbn
}
我会找类似的东西

@foreach (Title item in Model)
{
    @item.Select("Name")
    @item.Select("Isbn")
}

我没有asp方面的经验,所以我不确定在您的特定环境中这是否可行

但通常情况下,你可以使用反射。但是你必须知道你是在寻找属性还是字段

对于字段:

FieldInfo fi = item.GetType().GetField("Name", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
var value = fi.GetValue(item); // read a field
fi.SetValue(item, value); // set a field
对于属性:

PropertyInfo pi = item.GetType().GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
var value = pi.GetValue(item); // read a property
pi.SetValue(item, value); // set a property

谷歌称之为反射,大多数方法都可以在类中找到。

实现这一点的方法之一是通过反射。将此帮助器方法添加到某个位置:

private object GetValueByPropertyName<T>(T obj, string propertyName)
{
    PropertyInfo propInfo = typeof(T).GetProperty(propertyName);

    return propInfo.GetValue(obj);
}

我强烈建议不要在视图中使用反射,因为它破坏了MVC模式的主要原则。是的,您应该使用反射,但最好在控制器中使用反射。让我们看一个简单且有效的示例

在控制器中,我们设置要使用的存根数据。在action method About中,我们获得用户选择的属性的动态列表:

class Title
{
    // ctor that generates stub data 
    public Title()
    {
        Func<string> f = () => new string(Guid.NewGuid().ToString().Take(5).ToArray());
        A = "A : " + f();
        B = "B : " + f();
        C = "C : " + f();
        D = "D : " + f();
    }

    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        var data = new List<Title>()
        {
            new Title(), new Title(),
            new Title(), new Title()
        };

        // list of properties to display for user
        var fieldsSelectedByUser = new[] { "A", "C" };

        // here we obtain a list of propertyinfos from Title class, that user requested
        var propsInfo = typeof(Title).GetProperties().Where(p => fieldsSelectedByUser.Any(z => z == p.Name)).ToList();

        // query that returns list of properties in List<List<object>> format
        var result = data.Select(t => propsInfo.Select(pi => pi.GetValue(t, null)).ToList()).ToList();

        return View(result);
    }

    ...
}
在视图中,我们可以通过简单地迭代集合来使用它:

@model List<List<object>>

<br/><br />

@foreach (var list in @Model)
{
    foreach (var property in list)
    {
        <p> @property&nbsp;&nbsp;</p>
    }

    <br/><br />
}
附言


根据MVC模式,视图应该利用控制器返回的数据,但在任何情况下都不应该在其内部执行任何业务逻辑和全面的操作。如果视图需要某种格式的数据-它应该以所需的格式获取控制器返回的数据。

好的,您可以尝试一下,看看是否可以这样做。我不想成为一个混蛋,但我真的看不出有什么问题。谢谢你,我永远不会知道选择去寻找反思
@model List<List<object>>

<br/><br />

@foreach (var list in @Model)
{
    foreach (var property in list)
    {
        <p> @property&nbsp;&nbsp;</p>
    }

    <br/><br />
}