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

时间:2011-08-10 22:52:38

标签: c# .net 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...
}

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

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

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

提前致谢。

5 个答案:

答案 0 :(得分:27)

Tuple可能是您正在寻找的解决方案。

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

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

答案 1 :(得分:5)

The rules声明

  

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

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

答案 2 :(得分:2)

元组是一种干净的方式,但是只是为了让你知道 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,我不会用这个,我不要求你用这个:)

答案 3 :(得分:0)

您可以通过在C#4下声明参数dynamic来传递匿名类型。也就是说,除非在私有方法中,否则我不建议这样做。您将失去类型安全性,智能感知和可读性。

您还可以使用非泛型容器类,例如ArrayList。但是你又回到了铸造,这就是为什么我们首先得到了仿制药。

就个人而言,我会创建这个课程。看看是否有一个覆盖所有类型的抽象,并将其声明为接口,然后使用该类型的通用容器。

答案 4 :(得分:-2)

    public class GenericObjs
    {
        private List<object> objs = new List<object>();
        public List<object> Objs { get { return objs; } set { objs = value; } }
        public GenericObjs(List<object> Objs) { objs = Objs; }
    }

您可以包含List String和List String的构造函数...

我只是没有遇到丢弃课程的需要。如果业务对象具有结构,那么类是定义和实施该结构的方式,并且代码不多。