我经常发现自己需要创建一个类作为某些数据的容器。它只是简单地使用,但我仍然需要创建类。像这样:
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.
}
是否有更好的方法为一堆不同类型创建临时容器,或者每次需要临时对象将事物分组时是否需要定义类?
提前致谢。
答案 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)
您不能声明字段,属性,事件或返回类型 具有匿名类型的方法。同样,你不能声明 方法,属性,构造函数或索引器的形式参数 有匿名类型。
就个人而言,我只想咬住这一点以保持编译时的完整性。
答案 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的构造函数...
我只是没有遇到丢弃课程的需要。如果业务对象具有结构,那么类是定义和实施该结构的方式,并且代码不多。