我面临一个问题,我需要从多种类型构造一个对象并返回到前端,这就是我想要的(在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 {}
,或者其他任何东西都无所谓,只要一个对象同时拥有两个对象即可。
很显然,我在这里无法实现。这是我想出的两个选择。
public object Combine()
{
var foo = Foo();
var bar = Bar();
return new { foo, bar };
}
我知道我可以有一个Type
而不是一个匿名对象,问题是它将引入两个密钥foo
和bar
,如果可能的话,我不想这样做。
foo
和bar
仅返回instance
。否string
,int
,Array
,IEnumerable
等。
如果我以这种方式这样做,事情会变得容易一些。我需要做的就是遍历properties
得到values
并映射到new {}
或Dictionary<string, object>
。这样,我不需要引入新的密钥。 更新:因此,基本上,我想避免引入新密钥,因为我只想不带包装就返回原始密钥。这就是为什么我提出选项2的原因,只允许使用instance
。请让我知道您的想法。
答案 0 :(得分:0)
选项3)
Foo
和Bar
的包装的类,称为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);
}
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
}