匿名类型是没有名称的类型。 您可以使用匿名类型将一组只读属性封装在单个单元内-无需事先定义匿名类型。 本文讨论了什么是匿名类型,为什么它们很重要,以及我们如何在C#中使用匿名类型。
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
[ 同样在InfoWorld上:您将犯下的6个Git错误-以及如何解决它们 ]
在Visual Studio中创建控制台应用程序项目
首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的.NET Core控制台应用程序项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
- 点击下一步。
- 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
这将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用该项目来说明如何在C#中使用匿名类型。
了解C#中的匿名类型
本质上,匿名类型是引用类型,可以使用var关键字定义。 您可以具有匿名类型的一个或多个属性,但所有属性都是只读的。 与C#类相反,匿名类型不能具有字段或方法-它只能具有属性。
您可以在已定义匿名类型的方法内访问匿名类型或其属性。 换句话说,匿名类型的可访问性仅限于已定义匿名类型的范围。
在C#中使用匿名类型
现在让我们深入研究一些代码。 考虑以下匿名类型。
var author = new
{
FirstName = "Joydip",
LastName = "Kanjilal",
Address = "Hyderabad, INDIA"
};
在前面的代码片段中,author是使用new关键字创建的匿名类型的实例的名称。 (匿名类型本身的名称仅由编译器知道。)此匿名类型包含三个属性,分别是FirstName,LastName和Address。 所有这些属性都是字符串类型。 请注意,使用匿名类型时,不必在初始化属性之前指定属性的类型。
您可以使用以下代码段访问上述匿名类型的所有三个属性。
Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);
Console.WriteLine("Address: {0}", author.Address);
在C#中使用嵌套的匿名类型
匿名类型也可以嵌套。 也就是说,您可以将匿名类型作为另一个匿名类型内部的属性。 这是一个说明这一点的例子。
var author = new
{
FirstName = "Joydip",
LastName = "Kanjilal",
Address = new { City = "Hyderabad", Country = "INDIA"}
};
您可以访问此嵌套匿名类型的属性,如下面的代码片段所示。
Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);
Console.WriteLine("Address: {0}", author.Address.City);
下面给出了完整的程序供您参考。
static void Main(string[] args)
{
var author = new
{
FirstName = "Joydip",
LastName = "Kanjilal",
Address = new { City = "Hyderabad", Country = "INDIA"}
};
Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);
Console.WriteLine("Address: {0}", author.Address.City);
Console.Read();
}
在LINQ中使用匿名类型
LINQ中的Select子句创建并返回一个匿名类型。 下面的代码段对此进行了说明。
考虑以下名为Author的类。
public class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
以下代码段显示了如何创建作者列表。
IList<Author> authors =
new List<Author>()
{
new Author() { Id = 1, FirstName = "John", LastName = "Willey"} ,
new Author() { Id = 2, FirstName = "Steve", LastName = "Smith"} ,
new Author() { Id = 3, FirstName = "Bill", LastName = "Ruffner"} ,
new Author() { Id = 4, FirstName = "Joydip", LastName = "Kanjilal" }
};
下一个代码片段显示了如何利用LINQ中的Select子句以及匿名类型来在执行查询时返回结果。
var result = from a in authors select new
{
Id = a.Id,
Name = a.FirstName + "\t"+ a.LastName
};
现在,您可以在控制台窗口中显示作者ID和名称,如下面的代码片段所示。
foreach (var data in result)
Console.WriteLine(data.Name);
下面给出了完整的程序供您参考。
public class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Program
{
static void Main(string[] args)
{
IList<Author> authors = new List<Author>() {
new Author() { Id = 1, FirstName = "John",
LastName = "Willey"},
new Author() { Id = 2, FirstName = "Steve",
LastName = "Smith"},
new Author() { Id = 3, FirstName = "Bill",
LastName = "Ruffner"},
new Author() { Id = 4, FirstName = "Joydip",
LastName = "Kanjilal"}
};
var result = from a in authors
select new
{
Id = a.Id,
Name = a.FirstName + "\t" + a.LastName
};
foreach (var data in result)
Console.WriteLine(data.Name);
Console.Read();
}
}
匿名类型使您可以创建类型并快速实例化它,而不必提前声明该类型。 从CLR的角度来看,匿名类型只是另一个引用类型。 编译器在幕后为每种匿名类型提供了一个名称。
匿名类型从Object类派生。 这就是为什么您只能将匿名类型强制转换为Object类型的实例的原因。 还请注意,方法,属性,事件,委托等的返回类型不能为匿名类型。
如何在C#中执行更多操作:
- 何时在C#中使用抽象类与接口
- 如何在C#中使用AutoMapper
- 如何在C#中使用Lambda表达式
- 如何在C#中与Action,Func和Predicate委托一起使用
- 如何在C#中使用Dapper ORM
- 如何在C#中实现一个简单的记录器
- 如何在C#中使用log4net
- 如何在C#中与委托人一起工作
- 如何在C#中使用属性
- 如何在C#中使用flyweight设计模式
- 如何在C#中实现存储库设计模式
- 探索C#中的虚拟和抽象方法
- 如何在C#中使用反射
- 如何在C#中使用FileSystemWatcher
From: https://www.infoworld.com/article/3536470/how-to-use-anonymous-types-in-csharp.html