2009-04-03 11 views
11

匿名型のオブジェクトに、その宣言されたスコープ外のオブジェクトにアクセスするにはどうすればよいですか?C#匿名型オブジェクトへのアクセス

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

答えて

26

その他の回答には、と書かれていますが、実際にはこれをしないでください。しかし、あなたが主張するならば、あなたがそれを行うことを可能にする "模範的なキャスト"として知られている厄介なハックがあります。技術は、記事のいくつか、herehereに記載されています。

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

(私はthe author of one of those articles says that he doesn't want to be associated with it eitherものの、このハックのための信用を取ることができない彼の名前はおなじみかもしれません。。)

+0

8秒で殴られる!私は私を削除しました(それを複製する利点はありません)。しかし、ストレスをかけるために:***これをしないで*** ;-p –

+0

あなたはこれをあなたの好みの答えとして受け入れました。興味深いテクニックですが、重要な/プロダクションコードで使用することを強くお勧めします。 – LukeH

+1

これができることを知っておいてよかったです。しかし、本当に悪いですが、そうです。私はmuhahhhhahahaaaaです。 –

7

関数から匿名型を返すことはできません。 MSDN documentationから

:匿名型、または匿名型を含むコレクションを渡すために

は、法の境界の外側には、まずオブジェクトへのタイプをキャストする必要があります。しかし、これは匿名型の強い型付けを打ち消します。クエリ結果を格納するか、メソッド境界の外側に渡す必要がある場合は、匿名型の代わりに通常の名前付き構造体またはクラスを使用することを検討してください。

1

匿名型はコンパイラによって生成されたクラスであり、コンパイラはクラス自体の名前をあなたに知らせることはできません。したがって、objectへの参照を返す以外の関数からこのクラスのインスタンスを返すことはできません。

1

まあ、私は答えていると思う:匿名型を宣言されたスコープの外で使用しないでください。この場合、単純な型を作成します。

0

この場合のクラス作成します。その後、

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

コードを確認してください。私はそれを再フォーマットしましたが、正しくはないと私は信じています。また、コードの書式を正しく設定する方法については、[faq]を参照してください。そして、あなたが何かを投稿し、それがひどいように見えるときは、あなたの投稿を編集して修正することができます。(http://stackoverflow.com/posts/2509405/edit) – Will

2

.NET 4.0を使用している場合は、このためにタプルを使用できます。 a Tuple<int, string>。あなたは2.0/3.5用の独自のタプルを実装することができます。実際に他の人が既に持っているので、好きなときにそれを行うことができます。

0

オープンソースフレームワークImpromptu-Interfaceでは、匿名オブジェクトをインターフェイスにキャストすることができます。アセンブリの境界を越えて期待どおりに動作するため、ハッキリしないという利点があります。これは、軽量プロキシとdlrを使用してこれを実現します。

関連する問題