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