C# 将类字段发布为另一个类字段

C# 将类字段发布为另一个类字段,c#,nested,field,C#,Nested,Field,在C#中可以做这样的事情吗 换句话说,是否有可能将Bar类的字段发布为基类?不直接发布,但您可以向“外部”类添加属性以明确地公开它们 Foo a = new Foo(); a.Value = 5; a.Value2 = 8; 然而,这当然不是很方便。如果您真的想更“自动”地实现类似的功能,您可能可以使用动态和自定义类型描述符,但这反过来会阻止编译时类型和成员验证。。我不建议这样做,除非您绝对必须这样做。不要直接这样做,但您可以将属性添加到“outer”类中,以明确地公开它们 Foo a =

在C#中可以做这样的事情吗


换句话说,是否有可能将Bar类的字段发布为基类?

不直接发布,但您可以向“外部”类添加属性以明确地公开它们

Foo a = new Foo();
a.Value  = 5;
a.Value2 = 8;

然而,这当然不是很方便。如果您真的想更“自动”地实现类似的功能,您可能可以使用
动态
和自定义类型描述符,但这反过来会阻止编译时类型和成员验证。。我不建议这样做,除非您绝对必须这样做。

不要直接这样做,但您可以将属性添加到“outer”类中,以明确地公开它们

Foo a = new Foo();
a.Value  = 5;
a.Value2 = 8;

然而,这当然不是很方便。如果您真的想更“自动”地实现类似的功能,您可能可以使用
动态
和自定义类型描述符,但这反过来会阻止编译时类型和成员验证。。我不建议,除非你绝对必须这样做。

因为你在你的类
Foo
中有一个
Bar
type属性,你就有了composition。您可以通过该属性访问字段,如:

public class Foo
{
    Bar Field{get;set;}

    public int Value{get { return Field.Value;} }
    public int Value2{get { return Field.Value2;} }
}

public class Bar
{
    public int Value{get;set};
    public int Value2{get;set;}
}
但您必须修改当前代码,如:

Foo a = new Foo();
a.Field.Value = 1;
a.Field.Value2 = 2;
另一个选项是在
Foo
中继承
Bar
,如:

public class Foo
{
    public Bar Field { get; set; } //make the property public
}

public class Bar
{
    public int Value { get; set; }
    public int Value2 { get; set; }
}
然后您可以直接访问
栏的字段,如:

public class Foo : Bar
{
    public int FooID { get; set; }
}

因为在类
Foo
中有一个
Bar
type属性,所以就有了composition。您可以通过该属性访问字段,如:

public class Foo
{
    Bar Field{get;set;}

    public int Value{get { return Field.Value;} }
    public int Value2{get { return Field.Value2;} }
}

public class Bar
{
    public int Value{get;set};
    public int Value2{get;set;}
}
但您必须修改当前代码,如:

Foo a = new Foo();
a.Field.Value = 1;
a.Field.Value2 = 2;
另一个选项是在
Foo
中继承
Bar
,如:

public class Foo
{
    public Bar Field { get; set; } //make the property public
}

public class Bar
{
    public int Value { get; set; }
    public int Value2 { get; set; }
}
然后您可以直接访问
栏的字段,如:

public class Foo : Bar
{
    public int FooID { get; set; }
}

你想让合成像继承一样工作?你必须在Foo中滚动你自己的属性。你想让合成像继承一样工作吗?你必须在Foo中滚动你自己的属性。OP使用
set
accessor。我相信他的智慧能够找到模式并相应地应用。这就是我想要实现的,但我想自动实现这一点。这是不可能的。只有继承允许这样做。正如我所说,在
动态
和/或智能代理和/或DLR运行时中,可以部分实现类似的功能,但这会产生“仅公开子对象的属性”所无法预料的后果。你必须修改你想要达到的目标。组合不是继承。啊,还有一件事:你可以像我所展示的那样,在“外部对象”中把它作为显式属性,并让它自动写入。请参阅“T4代码模板”。IDE/编译器可以扫描类的定义并生成所有转发代码。这将仍然是一个丑陋的明确的前锋,但你将不必写。(好吧,除了T4,你必须在互联网上书写或查找;)OP也使用
set
accessor。我相信他的智慧可以找到这种模式并相应地应用。这是我想要实现的,但我想自动实现这一点是不可能的。只有继承允许这样做。正如我所说,在
动态
和/或智能代理和/或DLR运行时中,可以部分实现类似的功能,但这会产生“仅公开子对象的属性”所无法预料的后果。你必须修改你想要达到的目标。组合不是继承。啊,还有一件事:你可以像我所展示的那样,在“外部对象”中把它作为显式属性,并让它自动写入。请参阅“T4代码模板”。IDE/编译器可以扫描类的定义并生成所有转发代码。这将仍然是一个丑陋的明确的前锋,但你将不必写。(好的,除了T4之外,您必须在internet上写入或查找;))或
公共条形字段{get;private set;}
。或
公共条形字段{get;private set;}