C#返回(动态或匿名?)对象,并将其他方法的返回值作为属性



我想返回一个对象,它将其他类方法的返回值存储为返回对象的属性。问题是,我不知道在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"

相关内容

最新更新