0

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

所以我的问题是,我应该使用动态返回类型吗?我不只是返回一个匿名对象吗?

4

3 回答 3

2

为返回类型创建一个类。你想要一些强类型的东西,无论是为了性能还是为了清晰。

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谨慎使用。这样任何人都可以看到你的方法返回了什么。如果您返回动态,则调用者无法知道在动态中查找什么而不查看您的方法的源。这样抽象就消失了,结构良好的编程就是抽象。

于 2020-03-24T14:13:38.113 回答
2

我应该使用动态返回类型吗?

是的 - 一个dynamic有效返回的方法返回一个object,因此您必须使用dynamic它才能在运行时访问它的属性而无需反射。

我不只是返回一个匿名对象吗?

你是,但是方法的声明类型是有效的object,所以它的属性不能在编译时被引用。

底线 - 如果可能,您应该避免从方法返回匿名类型。使用已定义的类型,或将匿名类型的创建和使用保留在一种方法中,以便您可以使用var并让编译器推断类型。

于 2020-03-24T14:15:19.990 回答
0

仅为方法返回创建新类的替代方法是ValueTuple

public static (string myString, int myInt) MyExportingMethod()
{
    return (MyStringMethod(), MyIntMethod());
}

var (myString, myInt) = Test.MyExportingMethod();
myString; // == "Hello"
于 2020-03-24T14:30:06.910 回答