44

我们都知道,当我们像这样创建一个匿名类时:

var Employee = new { ID = 5, Name= "Prashant" };

...在运行时它将是以下类型:

<>f__AnonymousType0<int,string>

有没有办法为这些类指定一个有意义的名称?

4

10 回答 10

129
public class Employee {}

于 2009-04-27T13:10:17.830 回答
39

这是一种匿名类型,违背了目的。这些对象被设计为临时的。地狱,这些属性甚至是只读的。

对不起,我是个聪明人。答案是否定的,没有办法告诉编译器为匿名类型使用什么名称。

事实上,编译器生成的类型名称在其命名中使用了非法字符,因此您的应用程序中不会出现名称冲突。

于 2009-04-27T13:12:07.747 回答
36
public class Employee {
    public int ID { get; set; }
    public string Name { get; set; }
}

然后使用以下语法

var employee = new Employee { ID = 5, Name = "Prashant" };
于 2009-04-27T13:12:38.960 回答
24

让它成为一个有名字的普通班级?

public class Employee
{
    public int ID;
    public string Name;
}


var Employee = new Employee { ID = 5, Name= "Prashant" };
于 2009-04-27T13:10:05.630 回答
24

实际上,如果您不害怕变得非常琐碎,您可以使用 TypeBuilder 根据您的匿名类型构建您自己的运行时类型,这将允许您指定类型的名称。当然,像这个线程中几乎所有其他人所建议的那样,只声明一个类要容易得多,但是 TypeBuilder 的方式要令人兴奋得多。;)

类型生成器

于 2009-04-27T13:26:55.463 回答
8

Java World 中的答案将是本地类(在方法中定义),而 C# 中没有。

于 2011-06-28T22:41:08.907 回答
4

是的,您正在创建一个Anonymous Class,如果您希望您的类有一个名称,即Not Anonymous,那么声明一个常规类或结构。

于 2009-04-27T13:15:49.390 回答
4

由于它是匿名的,因此您无法命名它。如果您需要知道类型的名称,那么您必须真正创建一个类。

于 2009-04-27T13:18:33.270 回答
4

不,没有办法给这些类一个有意义的类型名称,因为你已经声明了它们。匿名类型就是这样,匿名的。如果不求助于非常丑陋的黑客,就没有办法在代码中明确地“命名”类型。

如果您确实需要为类型命名,则需要显式声明并使用具有所需属性的新类型。

于 2009-04-27T13:20:21.970 回答
2

我认为,根据定义,匿名类型不能有一个名字,只有编译器给它的名字。如果您正在寻找有关匿名类型的更有意义的设计时信息,那么您对编译器的期望过高。

于 2009-04-27T13:14:00.410 回答