2

私はおそらくここでのポイントを完全に見逃していますが....

'var'を別のメソッドに渡すにはどうすればよいですか?

(私はlinqを使用してXMLをオブジェクトの列挙可能なリストにロードしています)。

オブジェクトタイプが異なります(フィールドが異なります)が、使用されているオブジェクトに関係なく、プロセスの最終ステップは同じです。

XNamespace xmlns = ScehmaName;
var result = from e in XElement.Load(XMLDocumentLocation).Elements(xmlns + ElementName)
             select new Object1
             {
                 Field1 = (string)e.Element(xmlns + "field1"),
                 Field2 = (string)e.Element(xmlns + "field2")
             };

var result2 = Enumerable.Distinct(result);

このコードは、処理されるXMLファイルの種類によって異なります。しかし、その後、コードを繰り返し処理して、さまざまな問題をチェックしたいと思います。

foreach (var w in result2)
{
    if (w.CheckIT())
    {
        //do something
    }  
}

私が気に入っているのは、基本クラスのメソッドに含まれる最後のステップであり、各子クラスから「var」変数をメソッドに渡すことができます。

4

3 に答える 3

3

のタイプwObject1(上記のコード内)です。これは、キーワードの上にマウスをvar置いて、VisualStudioに表示されるツールチップを確認することで見つけることができます。

あなたの質問から見分けるのは難しいですが、CheckItメソッドはの基本タイプで定義されているようですObject1。もしそうなら、あなたはそれらをチェックするためのあなたのメソッドを書くことができます

protected void CheckAll<T>(IEnumerable<T> result) where T : <base type with CheckIt method>
{
    foreach(var w in result)
    {
        if(w.CheckIt())
        {
            // do something
        }
    }
}
于 2010-03-28T16:33:28.360 に答える
3

「var」変数のようなものはないことに注意してください。キーワードを使用して宣言された変数varには、実際の型(コンパイラーによって推測される)があります。この型を明示的に記述する必要はありませんが、それでもそこにあります(コンパイラは、varコードの処理を開始すると、宣言を実際の型に置き換えます)。この意味は:

var n = 10 
// .. is exactly the same thing as:
int n = 10

そしてあなたの例では:

var result = 
  from e in ... select new Object1 { ... };
// .. is exactly the same thing as:
IEnumerable<Object1> result = 
  from e in ... select new Object1 { ... };

new { Name="Test" }匿名型(たとえば)を使用すると、コードで使用できる名前がないため(したがって、を使用して操作する必要があるためvar)、コードに匿名型が含まれていないため、状況はさらに複雑になります。タイプ、これはあなたにとって問題ではないはずです。これは、技術的には匿名タイプvarにはまったく適用されない機能であることを理解しておくと便利です。

于 2010-03-28T16:44:44.093 に答える
2

オブジェクトはとして入力されObject1ます。次のようなメソッドを作成できるはずです。

private void CheckAll(IEnumerable<Object1> result)
{
    foreach(var w in result)
    {
        if(w.CheckIt())
        {
            // do something
        }
    }
}

そして、次のように使用します。

CheckAll(result2);

関数がすべて異なるタイプを処理しCheckIt、共通のベースタイプで確立されていない場合、C#3ではこれは(リフレクションなしで)不可能です。C#4では、動的型付け(特にこの場合は「ダックタイピング」)が導入されています。これ。

于 2010-03-28T16:33:18.290 に答える