C# 访问C匿名类型对象

C# 访问C匿名类型对象,c#,anonymous-types,C#,Anonymous Types,如何访问其声明范围之外的匿名类型的对象 public class LISTFUNCA { public int identificacion; public string nombre; } public List<LISTFUNCA> FuncA() { var lista = (fro

如何访问其声明范围之外的匿名类型的对象

public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     
例如

void FuncB()
{
var obj = FuncA();
Console.WriteLine(obj.Name);
}

??? FuncA()
{
var a = (from e in DB.Entities
where e.Id == 1
select new {Id = e.Id, Name = e.Name}).FirstOrDefault();

return a;
}
public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     

不能从函数返回匿名类型

public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     
从:

public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     
若要在方法边界之外传递匿名类型或包含匿名类型的集合,必须首先将该类型强制转换为对象。但是,这会破坏匿名类型的强类型。如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类,而不是匿名类型。

public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     

匿名类型只是编译器生成的类,编译器不愿意告诉您类本身的名称。因此,除了返回对对象的引用之外,您无法从函数返回此类的实例。

我认为答案是:不要在其声明的范围之外使用匿名类型。在本例中,创建一个简单类型。

正如其他答案所述,您确实不应该这样做。但是,如果你坚持的话,那么有一个叫做cast by example的讨厌的黑客可以让你这么做。这项技术在几篇文章中提到,并且

public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     

不过,我不能认为这是黑客的功劳。他的名字可能很熟悉。

会为这种情况创建一个类:

public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     
然后:

public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}     

如果您使用的是.NET4.0,那么可以使用元组,返回一个元组。您可以为2.0/3.5实现您自己的元组,实际上其他人已经实现了元组,因此如果您愿意,您应该可以这样做。

开源框架将允许您将匿名对象强制转换到接口。它的优点是不太容易被攻击,因为它可以像预期的那样跨装配边界工作。它使用一个轻量级代理和dlr来实现这一点。

领先8秒!我把我的删除了,复制也没什么好处。但要强调:不要这样做-pSo你已经接受了这个作为你的首选答案。尽管这是一种有趣的技术,但我强烈建议不要在任何重要/生产代码中使用它!嗯。很高兴知道这是可以做到的。虽然它真的很邪恶,但我也是。muhahhhahaaaa。谢谢你,我没有使用它:我最终只是使用了不可变结构。这个黑客确实有一个特别的警告,它不会跨程序集边界工作。这是因为编译器根据每个程序集的签名生成一次类型,因此如果使用var example=new{Id=0,Name=string.Empty};在与FuncA不同的程序集中,类型将不匹配。请检查代码;我重新格式化了它,但我认为它不正确。另外,有关如何正确格式化代码的详细信息,请阅读。而且,当你发布一些看起来很糟糕的东西时,别忘了你可以复制它
public class LISTFUNCA   
{                         
    public int identificacion;  
    public string nombre;      
}     
public List<LISTFUNCA> FuncA()   
{                                          
    var lista = (from e in DB.Entities where e.Id == 1                        
                select new { identificacion = e.Id, nombre = e.Name})
                .FirstOrDefault();  
    return lista.ToList(); 
}