我想返回一个对象,它将其他类方法的返回值存储为返回对象的属性。问题是,我不知道在C#中哪种方法是最好的。目前我使用的是一种类似JavaScript的方法。因为我不知道返回类型,所以我使用dynamic关键字。
class Test {
public static dynamic MyExportingMethod() {
return new {
myString = MyStringMethod(),
myInt = MyIntMethod()
};
}
public static string MyStringMethod() {
return "Hello";
}
public static int MyIntMethod() {
return 55;
}
}
然后能够像这样访问它们,
var myReturnObjWithProps = Test.MyExportingMethod();
myReturnObjWithProps.myString; // should be "Hello"
所以我的问题是,我应该使用动态返回类型吗?我不只是返回一个匿名对象吗?
Yes-一个返回dynamic
的方法有效地返回了一个object
,因此您必须使用dynamic
才能在运行时访问它的属性而不进行反射。
我不只是返回一个匿名对象吗?
确实如此,但方法的声明类型实际上是object
,因此在编译时无法引用其属性。
最重要的是,如果可能的话,应该避免从方法返回匿名类型。使用已定义的类型,或者将匿名类型的创建和使用保留在一个方法中,以便使用var
并让编译器推断类型。
为返回类型创建一个类。为了性能和清晰度,您需要强类型的内容。
class Foo
{
string MyString { get; set}
int MyInt { get; set}
}
class Test
{
public static Foo MyExportingMethod()
{
return new Foo
{
MyString = MyStringMethod(),
MyInt = MyIntMethod()
};
}
public static string MyStringMethod()
{
return "Hello";
}
public static int MyIntMethod()
{
return 55;
}
}
您应该谨慎使用dynamic
。通过这种方式,任何人都可以看到您的方法返回了什么。如果您返回dynamic,那么如果不查看方法的源,调用者就无法知道在动态中要查找什么。这样一来,抽象就消失了,结构良好的编程就是抽象。
除了为方法返回创建一个新类之外,还可以使用ValueTuple
:
public static (string myString, int myInt) MyExportingMethod()
{
return (MyStringMethod(), MyIntMethod());
}
var (myString, myInt) = Test.MyExportingMethod();
myString; // == "Hello"