如何在不显式创建类的情况下创建临时对象来传递?

Che*_*hev 15 .net c# oop object anonymous-types

我经常发现自己需要创建一个类作为一些数据的容器.它只是简单地使用,但我仍然需要创建类.像这样:

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...
}
Run Code Online (Sandbox Code Playgroud)

通常我的临时对象具有更多属性,这就是我想首先将它们分组的原因.我希望有一种更简单的方法,例如匿名类型.问题是,当我将它传递给另一种方法时,我不知道该接受什么.这种类型是匿名的,所以我怎么能在另一方接受呢?

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.
}
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法为一堆不同类型创建临时容器,或者每次需要临时对象将事物分组在一起时是否需要定义类?

提前致谢.

Jac*_*cob 29

元组可能是您正在寻找的解决方案.

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

public void DoSomethingElse(Tuple<string, string, DateTime> data)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在回答这个问题,因为它确实正是我所要求的.但是,我并不打算使用它,因为在实践中我认为它不是非常易读.创建自定义传输对象始终具有良好的名称,并且对于检查代码的任何人都非常易读.我可能会在某个时候找到Tuple的用法,但是课程的轻微开销只会让事情更容易理解和记忆. (7认同)
  • `data.Item1`,`data.Item2`等.不太可读,IMO. (3认同)

Nei*_*oss 6

规则说明了这一点

您不能将方法的字段,属性,事件或返回类型声明为具有匿名类型.同样,您不能将方法,属性,构造函数或索引器的形式参数声明为具有匿名类型.

就个人而言,我只想咬住这一点以保持编译时的完整性.

  • 直到你忘记元组参数的顺序为止. (7认同)