如何以编程方式提取AnonymousType?

时间:2015-03-18 04:37:40

标签: c# .net

我想提取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?

3 个答案:

答案 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);

这将完全删除动态/反射部分并使您的代码经过编译器验证(并且完全强类型化)。