C#将多种类型组合为一种

时间:2019-11-16 01:48:55

标签: c# asp.net .net asp.net-core .net-core

我面临一个问题,我需要从多种类型构造一个对象并返回到前端,这就是我想要的(在C#中)。

前端想要的形状就是这样

{
...
"props" : // this is the place I need to fill-up.
...
}

对于控制器,这是一个自定义响应。

        public IActionResult Index()
        {
            return JohnDoe.Render();
        }

在幕后,Render将从两个地方获取一些数据。

        public object Foo()
        {
            return string, int, IEnumerable, instance, etc;
        }

        public object Bar()
        {
            return string, int, IEnumerable, instance, etc;
        }

我知道return语句是无效的,我的意思是所有这些都是可能的。

这终于是我想要的。

        public object Combine()
        {
            var foo = Foo();
            var bar = Bar();

            return foo + bar;
        }

同样,return语句无效,我想要一个包含两者的最终object。它可以是Dictionary<string, object>或匿名对象new {},或者其他任何东西都无所谓,只要一个对象同时拥有两个对象即可。

很显然,我在这里无法实现。这是我想出的两个选择。

  1. 只需使用包装器将它们包装起来,这就是我要做的。
        public object Combine()
        {
            var foo = Foo();
            var bar = Bar();

            return new { foo, bar };
        }

我知道我可以有一个Type而不是一个匿名对象,问题是它将引入两个密钥foobar,如果可能的话,我不想这样做。

  1. 使foobar仅返回instance。否stringintArrayIEnumerable等。 如果我以这种方式这样做,事情会变得容易一些。我需要做的就是遍历properties得到values并映射到new {}Dictionary<string, object>。这样,我不需要引入新的密钥。

更新:因此,基本上,我想避免引入新密钥,因为我只想不带包装就返回原始密钥。这就是为什么我提出选项2的原因,只允许使用instance。请让我知道您的想法。

3 个答案:

答案 0 :(得分:0)

选项3)

  • 创建一个用作FooBar的包装的类,称为FooBar
public class FooBar
{
    public Foo Foo { get; set; }
    public Bar Bar { get; set; }
}

为什么?

  

C#是一种面向对象的编程语言。它基于将数据片段和与数据相关的行为包装到称为对象的特殊束中的概念,这些束是从称为类的“蓝图”中构造的。

答案 1 :(得分:0)

您可以使用Tuple

    public Tuple<Foo, Bar> Combine()
    {
        var foo = Foo();
        var bar = Bar();

        return Tuple.Create(foo, bar);
    }

ValueTuple

    public (Foo, Bar) Combine()
    {
        var foo = Foo();
        var bar = Bar();

        return (foo, bar);
    }

还具有命名字段:

    public (Foo foo, Bar bar) Combine()
    {
        var foo = Foo();
        var bar = Bar();

        return (foo, bar);
    }

或者,按照Dennis1679的建议,进行自定义类型。

答案 2 :(得分:0)

我想这就是你要问的

public sealed class FooBar : Foo, Bar
{

}

不幸的是,这在C#中是不可能的。但本质上,这就是您在做什么。您可以执行以下操作:

public sealed class FooBar: IFoo, IBar
{
    public FooBar(IFoo foo, IBar bar)
    {
        ///Assign its members
    }

    ///Implement its members
}