【问题标题】:c# combine multiple types into onec# 将多种类型合二为一
【发布时间】:2019-11-16 01:48:55
【问题描述】:

我面临一个问题,我需要从多种类型构造一个对象并返回到前端,这就是我想要的(在 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。请告诉我你的想法。

【问题讨论】:

  • 这听起来像是 X-Y 问题。你有一个问题X,你认为如果你能做Y,那么你就可以解决这个问题,所以你来这里是为了问Y,这让我们很困惑。你告诉我们X实际上是什么?你到底想做什么?
  • @Enigmativity hahhah,你是绝对正确的。然而,这是问题的核心。
  • 是的,但是您所说的问题令人困惑和抽象。如果您告诉我们您真正想要做什么,那么我们也许可以给出一个很好的答案。
  • @Enigmativity 我认为你是对的,我会尽快更新问题。
  • @Enigmativity 抱歉,我之前没有说清楚我的问题,现在我已经更新了问题,如果可以理解请告诉我。谢谢

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


【解决方案1】:

您可以使用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 的建议,制作自定义类型。

【讨论】:

  • 对不起,我之前没有说清楚我的问题,现在我已经更新了问题,如果可以理解请告诉我。谢谢
  • @AndySong 我想 out 参数也对你没有帮助。会返回一个对象数组吗?我不知道是什么原因导致新键没有。
  • 问题是当我返回 IEnumerable 时,我必须分配一些魔法键。也许像列表的索引。是的,所以问题是当我返回数组时,我确实知道键是什么。
【解决方案2】:

选项 3) 怎么样

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

为什么?

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

【讨论】:

  • 我觉得和option 1很像,唯一不同的是这个是FooBar类型,option 1是匿名对象。我不确定我是否喜欢它。
  • 对不起,我之前没有说清楚我的问题,现在我已经更新了问题,如果可以理解请告诉我。谢谢
【解决方案3】:

我想这就是你要问的

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2021-01-11
    • 1970-01-01
    • 2020-12-02
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多