web-dev-qa-db-ja.com

クラスを明示的に作成せずに渡す一時オブジェクトを作成するにはどうすればよいですか?

私は頻繁に自分自身をいくつかのデータのコンテナとしてクラスを作成する必要がある見つけます。簡単に使用されるだけですが、クラスを作成する必要があります。このような:

public class TempObject
{
    public string LoggedInUsername { get; set; }
    public CustomObject SomeCustomObject { get; set; }
    public DateTime LastLoggedIn { get; set; }
}


public void DoSomething()
{
    TempObject temp = new TempObject
    {
        LoggedInUsername = "test",
        SomeCustomObject = //blah blah blah,
        LastLoggedIn = DateTime.Now
    };
    DoSomethingElse(temp);
}

public void DoSomethingElse(TempObject temp)
{
    // etc...
}

通常、私の一時オブジェクトは、私が最初の場所でのグループにそれらをしたい理由である、より多くの特性を有しています。匿名型など、もっと簡単な方法があればいいのにと思います。問題は、私は、私は別のメソッドに渡したときに何を受け入れることを知らない、です。タイプは匿名なので、どのように私は反対側にそれを受け入れることになってんですか?

public void DoSomething()
{
    var temp = new
    {
        LoggedInUsername = "test",
        SomeCustomObject = //blah blah,
        LastLoggedIn = DateTime.Now
    };
    // I have intellisense on the temp object as long as I'm in the scope of this method.
    DoSomethingElse(temp);
}

public void DoSomethingElse(????)
{
    // Can't get my anonymous type here. And even if I could I doubt I would have intellisense.
}

さまざまなタイプの一時コンテナを作成するためのより良い方法はありますか、それとも、物事をグループ化するための一時オブジェクトが必要になるたびにクラスを定義する必要がありますか?

前もって感謝します。

15
Chev

タプル あなたが探している解決策かもしれません。

public void DoSomething() 
{
    var temp = Tuple.Create("test", "blah blah blah", DateTime.Now);
    DoSomethingElse(temp);
}

public void DoSomethingElse(Tuple<string, string, DateTime> data)
{
    // ...
}
27
Jacob

ルール 次のように述べます

メソッドのフィールド、プロパティ、イベント、または戻り値の型を匿名型として宣言することはできません。同様に、メソッド、プロパティ、コンストラクター、またはインデクサーの仮パラメーターを匿名型として宣言することはできません。

個人的には、コンパイル時の整合性を維持するために、これに弾丸をかじるだけです。

5
Neil Moss

タプルはクリーンな方法ですが、お知らせするためだけに C#はそれ以外の場合でも失望させず、質問に答えると、DoSomethingElseは次のようになります。 :

private static void DoSomething(object temp)
        {
            var typedTemp = CastToType(temp, new
                            {
                                LoggedInUsername = "dummy",
                                SomeCustomObject = "dummy",
                                LastLoggedIn = DateTime.Now
                            });

            Console.WriteLine(typedTemp.LastLoggedIn);
        }

private static T CastToType<T>(object obj, T type)
        {
            return (T) obj;
        }

PS:-1を使用しないでください、私はこれを使用しません、私はあなたにこれを使用するように頼みません:)

2
manojlds

C#4で動的パラメーターを宣言することで、匿名型を渡すことができます。とはいえ、プライベートメソッドを除いてこれはお勧めしません。型安全性、IntelliSense、および読みやすさが失われます。

ArrayListなどの非ジェネリックコンテナクラスを使用することもできます。しかし、その後、キャストに戻ります。そのため、最初にジェネリックを入手しました。

個人的にクラスを作成します。すべての型をカバーする抽象化があるかどうかを確認し、それをインターフェースとして宣言してから、その型の汎用コンテナーを使用します。

0
TrueWill