C#如何在C#和Razor中访问动态变量属性
本文关键字:访问 动态 变量 属性 Razor | 更新日期: 2023-09-27 18:27:02
我有一个存储在数据库中的存储过程的名称(以及几个视图)。在运行时,我查询数据库,然后运行所需的查询。由于我不知道查询的字段名,也没有已知的对象来存储结果,所以我使用了一个动态变量
dynamic results = Respository.GetTableContents();
// not exactly the code but it conveys the point
该表可能有未知数量的字段,但在本例中,字段名称为
Id, FirstName, Lastname //(this is what the table would be returning)
// Normally stored to a list of the model type
List<Users> resultsFromTable = ...
可以访问生成的动态数据
foreach(var r in result)
{
string name = r.FirstName + " " + r.LastName;
//.... Do something with the code, etc.
}
如果你知道房产名称,那就太好了。我不知道房子的名字。
如何在不知道属性名称的情况下访问动态变量的数据
我的主要目标是在视图中使用这个(剃须刀)
也许我处理这个问题的方法不对,还有更好的方法。有什么想法吗?
另一种选择是使用System.Reflection
。试试这个:
foreach (var r in results)
{
string name, trimmedName = "";
if (r.GetType() == typeof(ExpandoObject))
{
name = ((IDictionary<string,object>)r).ToList()
.Aggregate<KeyValuePair<string,object>, string>("", (s, p) =>
{
return s + " " + p.Value;
});
trimmedName = name.Trim();
}
else
{
PropertyInfo[] ps = r.GetType().GetProperties();
name = ps.Aggregate<PropertyInfo, string>("", (s, p) =>
{
return s + " " + p.GetValue(r);
});
trimmedName = name.Trim();
}
// use the trimmedName
Console.WriteLine(trimmedName);
}
[编辑]基于@pwas'suggestio,这里有一个改进了循环复杂度的代码版本:
foreach (var r in results)
{
ProcessResult(r);
}
其中ProcessResult
有2个过载:
static void ProcessResult(ExpandoObject r)
{
string name, trimmedName = "";
name = ((IDictionary<string, object>)r).ToList()
.Aggregate<KeyValuePair<string, object>, string>("", (s, p) =>
{
return s + " " + p.Value;
});
trimmedName = name.Trim();
FurtherProcess(trimmedName);
}
static void ProcessResult(object r)
{
string name, trimmedName = "";
PropertyInfo[] ps = r.GetType().GetProperties();
name = ps.Aggregate<PropertyInfo, string>("", (s, p) =>
{
return s + " " + p.GetValue(r);
});
FurtherProcess(trimmedName);
}
private static void FurtherProcess(string trimmedName)
{
Console.WriteLine(trimmedName);
}
以下是改进:
Type Maintainability Cyclomatic
Index Complexity
Program 54 24
// After code optimization
Program 69 16