65.9K
CodeProject 正在变化。 阅读更多。
Home

返回匿名类型。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.19/5 (19投票s)

2012年10月16日

CPOL

2分钟阅读

viewsIcon

59984

返回匿名类型。

在本文中,我将讨论如何返回匿名类型以及如何在代码中处理它。以下是关于匿名类型的一些事实: 

关于匿名类型的快速了解
  • 匿名类型是源自system.objects的引用类型。
  • 匿名类型的属性是只读的。
  • 如果两个匿名类型具有相同的属性和相同的顺序,则编译器将它们视为相同类型。但如果它们都在同一个程序集中。
  • 匿名类型具有方法作用域。如果您想从方法返回匿名类型,则必须将其转换为对象类型。但这并不是一个好的做法。
您可以在博客中阅读更多相关信息:匿名类型
正如上述事实所述,您无法直接从方法返回匿名类型,如果想返回,则需要将其转换为对象。
现在,在下面的文章中,我将以对象的形式返回匿名类型,并展示三种不同的处理方法。
  • 方法 1:使用动态类型处理 
  • 方法 2:通过创建相同的匿名类型处理 
  • 方法 3:使用反射处理
为了理解每种方法,我创建了以下返回匿名类型的方法
object AnonymousReturn()
{
     return new { Name = "Pranay", EmailID = "pranayamr@gmail.com" }; 
}
方法 1:使用动态类型处理
dynamic newtype= AnonymousReturn();
Console.WriteLine(newtype.Name + "  " + newtype.EmailID);
如上例所示,第一行代码调用返回匿名类型作为对象的方法,并将返回值赋给动态类型。第二行代码只是打印匿名类型的属性值。
注意:由于我们正在使用动态类型,因此没有 IntelliSense 支持。还需要记住属性名称和类型。

方法 2:通过创建相同的匿名类型处理
object o = AnonymousReturn();
var obj = Cast(o, new { Name = "", EmailID = "" });
Console.WriteLine(obj.Name + "  " + obj.EmailID);
在这种方法中,匿名类型的返回值被赋给对象。下一行代码将对象转换为相同的匿名类型。为了完成此任务,以下方法执行对象的转换。
T Cast<T>(object obj, T type) { return (T)obj; }
这完成了类型转换并提供了智能支持。

方法 3:使用反射处理
object refobj = AnonymousReturn();
Type type = refobj.GetType(); 
PropertyInfo[] fields = type.GetProperties(); 
foreach (var field in fields) 
{
   string name = field.Name; 
   var temp = field.GetValue(obj, null);
   Console.WriteLine(name + "  " + temp);
}
这种方法利用了 .net 的反射特性。第一行代码调用该方法并将返回值赋给 refobj。第二行代码获取对象的类型,然后下一行代码获取匿名类型的属性并打印其值。
查看完整的源代码以测试我们讨论的所有技术
using System;p
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            dynamic newtype= p.AnonymousReturn();
            Console.WriteLine("With Dynamic Type");
            Console.WriteLine(newtype.Name + "  " + newtype.EmailID);
            Console.WriteLine();
            Console.WriteLine("With Creation of same anonymous type");
            object o = p.AnonymousReturn();
            var obj = p.Cast(o, new { Name = "", EmailID = "" });
            Console.WriteLine(obj.Name + "  " + obj.EmailID);
            Console.WriteLine();
            Console.WriteLine("With Reflection");
            object refobj = p.AnonymousReturn();
            Type type = refobj.GetType(); 
            PropertyInfo[] fields = type.GetProperties(); 
            foreach (var field in fields) 
            {
                string name = field.Name; 
                var temp = field.GetValue(obj, null);
                Console.WriteLine(name + "  " + temp);
            }

            Console.ReadLine();
        }

         object AnonymousReturn()
        {
            return new { Name = "Pranay", EmailID = "pranayamr@gmail.com" }; 
        }

        T Cast<T>(object obj, T type) { return (T)obj; }

        public static void Write()
        {
            Program p = new Program();
            object obj = p.AnonymousReturn();
            
        }
    }
}
输出 


结论
因此,现在借助上述技术,可以从方法返回匿名类型。
希望大家喜欢。请评分并留下您的评论。
© . All rights reserved.