我想提取AnoymousType,这是我的代码:
static void Main(string[] args)
{
Extract(new { Name = "Yoza" });
Extract(new [] { new { Name = "Yoza" }, new { Name = "Dhika" } });
}
private static void Extract(object param = null)
{
if(param.GetType().IsArray)
{
// Do something to get everyname
// Do Something to get value of variable "Name"
}
else
{
// Do Something to get a name
// Do Something to get value of variable "Name"
}
}
如果我没有将该代码放在方法中,它的工作原理如下:
var dd = new { A = "Yoza" };
var cc = new[] { new { A = "Yoza" } };
String name = dd.A;
name = cc[0].A;
问题是我想把它放在方法中。 如何以编程方式提取AnonympusType?
答案 0 :(得分:2)
您可以选择使用Reflection API从对象中获取值,如下所示:
public class Program
{
public static void Main()
{
Extract(new { Name = "Yoza" });
Extract(new [] { new { Name = "Yoza" }, new { Name = "Dhika" } });
}
private static void Extract(object param = null)
{
if (param.GetType().IsArray)
{
var array = param as Array;
foreach(var element in array)
{
foreach(var item in element.GetType().GetProperties())
{
Console.WriteLine(string.Format("{0}: {1}", item.Name, item.GetValue(element)));
}
}
}
else
{
foreach(var item in param.GetType().GetProperties())
{
Console.WriteLine(string.Format("{0}: {1}", item.Name, item.GetValue(param)));
item.GetValue(param);
}
}
}
}
Here正在使用DOT NET FIDDLE。
答案 1 :(得分:1)
您可以接受dynamic
中的Extract
:
static void Extract(dynamic dd)
{
string name;
if (dd.GetType().IsArray)
{
name = dd[0].Name;
}
else
{
name = dd.Name;
}
}
这是否是一个好主意完全取决于您的用例,这在您的问题中并不明确。
答案 2 :(得分:1)
您可以按照建议使用dynamic
,但请将两种情况分开:
private static void Extract<T>(T param)
{
string name = ((dynamic)param).Name;
}
private static void Extract<T>(T[] param)
{
for (int i = 0; i < param.Length; i++)
{
string name = ((dynamic)param[i]).Name;
}
}
你的速度会有所提高,因为通过这种方式,单个vs阵列的拆分由编译器完成。
我通常会做的是:
private static void Extract<T>(T param, Func<T, string> getName)
{
string name = getName(param);
}
private static void Extract<T>(T[] param, Func<T, string> getName)
{
for (int i = 0; i < param.Length; i++)
{
string name = getName(param[i]);
}
}
使用类似:
Extract(new { Name = "Yoza" }, x => x.Name);
Extract(new [] { new { Name = "Yoza" }, new { Name = "Dhika" } }, x => x.Name);
这将完全删除动态/反射部分并使您的代码经过编译器验证(并且完全强类型化)。