簡體   English   中英

c# 多種類型合二為一

[英]c# combine multiple types into one

我面臨一個問題,我需要從多種類型構造一個 object 並返回到前端,這就是我想要的(在 C# 中)。

前端想要的形狀是這樣的

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

對於 controller,這是自定義響應。

        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>或匿名 object new {} ,或者只要一個 object 兩者兼有,其他東西都可以。

顯然我在這里所擁有的是不可能實現的。 這是我想出的兩個選項。

  1. 只需使用包裝器來包裝它們,這就是我所做的。
        public object Combine()
        {
            var foo = Foo();
            var bar = Bar();

            return new { foo, bar };
        }

我知道我可以有一個Type而不是匿名的 object,問題是這將引入兩個鍵foobar ,如果可能的話我不想這樣做。

  1. 使foobar只返回instance 沒有stringintArrayIEnumerable等。如果我這樣做,事情會變得容易一些。 我需要做的就是遍歷獲取valuesproperties和 map 到new {}Dictionary<string, object> 這樣我就不需要引入新的密鑰了。

更新:所以基本上我想盡可能避免引入新密鑰,因為我只想返回沒有包裝器的原始密鑰。 這就是為什么我想出了選項 2,只允許instance 請讓我知道你的想法。

選項3)怎么樣

  • 創建一個 class 作為FooBar的包裝器,稱為FooBar
public class FooBar
{
    public Foo Foo { get; set; }
    public Bar Bar { get; set; }
}

為什么?

C# 是一種面向對象的編程語言。 它基於將數據片段以及與該數據相關的行為包裝到稱為對象的特殊捆綁包中的概念,您可以從稱為 class 的“藍圖”構建這些包。

您可以使用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 建議的那樣,制作一個自定義類型。

我想這就是你要問的

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM