[英]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.