簡體   English   中英

訪問C#匿名類型對象

[英]Accessing C# Anonymous Type Objects

如何訪問其聲明范圍之外的匿名類型的對象?

例如

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 void FuncB()
{
    var example = new { Id = 0, Name = string.Empty };

    var obj = CastByExample(FuncA(), example);
    Console.WriteLine(obj.Name);
}

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

    return a.FirstOrDefault();
}

private T CastByExample<T>(object target, T example)
{
    return (T)target;
}

(雖然其中一篇文章的作者說他也不想與之相關聯,但我不能因此而受到贊譽 。他的名字可能很熟悉。)

您無法從函數返回匿名類型。

MSDN文檔

要在方法邊界外傳遞匿名類型或包含匿名類型的集合,必須先將類型轉換為對象。 然而,這打敗了匿名類型的強類型。 如果必須存儲查詢結果或將它們傳遞到方法邊界之外,請考慮使用普通的命名結構或類而不是匿名類型。

如果您使用的是.NET 4.0,則可以使用Tuples,您將返回Tuple<int, string> 您可以實現自己的2.0 / 3.5元組,實際上已有其他人已經擁有,所以如果您願意,您應該可以這樣做。

匿名類型只是編譯器生成的類,編譯器不願意告訴您類本身的名稱。 因此,除了返回object的引用之外,您無法從函數返回此類的實例。

好吧,我認為答案是:不要在聲明范圍之外使用匿名類型。 在這種情況下,創建一個簡單類型。

會為這種情況創建一個類:

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(); 
}     

開源框架Impromptu-Interface允許您將匿名對象轉換為接口。 它具有較少hacky的優點,因為它將按照預期在程序集邊界上工作。 它使用輕量級代理和dlr來實現這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM