2012-12-20 117 views
1

我有一些代码块,并且需要使用相同的对象的块以外的地方使用分配匿名类型多次,我可以使用强类型,如:具有相同的属性名称和类型

Person p = null; 
if(cond1) 
{ 
    p = new Person(); 
    p.Name = "Name1"; 
    p.Age = 25; 
} 
else if (cond2) 
{  
    p = Employees.Select(c=>new Person() {Name = c.FirstName + " " +c.LastName }).First(); 
    p.Age = 23; 
} 

if(p != null) 
{ 
    Console.Write(p.Name); 
} 

我需要通过匿名类型而不是人来做到这一点,我不能使用元组,因为属性名称没有命名,并且每次我需要这样的东西时都不能创建简单的类,这是一个非常简单的例子,但是什么关于LINQ的结果与我的例子类似吗?

+0

匿名类型只能内部使用的代码块,例如,它们不能被用作方法的参数和返回值。编写课程不会花费任何东西,如果它在业务逻辑中有意义,可以根据需要创建它们。 – SWeko

+0

你说你每次需要这样的东西时都不能创建小类。这是为什么? –

+0

@SWeko我确实需要他们在同样的方法,而不是在多种方法 –

回答

4

怎么这种事情

 var person = new { Name = "" }; ; 

     if (cond1) 
     { 
      person = new { Name = "Bob" }; 
     } 
     else 
     { 
      person = new { Name = "John" }; 
     } 

     Console.WriteLine(person.Name); 
+0

就是这样!感谢名单。 –

+0

这是一个不错的窍门,这要归功于这个特性:“如果程序集中的两个或多个匿名对象初始值设定项指定一系列属性顺序相同并具有相同名称和类型的属性,编译器会将对象视为实例属于同一类型“。 –

1

您可以尝试通过

dynamic p = null; 
1

更换

Person p = null; 

我会建议你创建的业务对象,这样你就不必使用匿名类型。但对你的问题的几个快速修复将是使用反射或将其作为动态类型传递。

编辑:

哦,你只是创建限制是对类型的特性的目的,新的亚型,这样你就不必指定要Console.Write()(或任何其性质其他功能)可用吗?我假设你正在查询的数据在这些函数之外是可用的,如果它是强类型的,那么你不需要创建匿名类型,只需使用这些类型......但是你必须在你的控制台中指定。写()行哪些属性来打印,这是我会建议。

+0

我需要一种快捷方式,因为这种类型不会在块外使用 –

相关问题