假设我有一个基类和这样的孩子:
class BaseType
{
string Name{get;set;}
string AddressLine1 {get;set;}
string PostalCode {get;set;}
}
class ChildType : BaseType
{
string extrafield {get;set;}
}
修改
我的自定义Update方法对于除一个额外字段之外的所有对象都是相同的。这些对象在WCF服务中使用,因此重用自定义SET WCF服务就是我要做的。
所以我会传递BaseType
或ChildType
;能够访问任一对象的基本属性,并做任何逻辑。
我正在尝试减少重复的代码。
答案 0 :(得分:4)
您可以使用BaseType
作为方法的参数:
void DoSomethingWithType(BaseType instance)
{
// Do something here..
Console.WriteLine(instance.Name);
}
这允许你写:
ChildType child = new ChildType() { Name = "Foo"; }
DoSomethingWithType(child);
答案 1 :(得分:2)
void SetMethod(BaseType obj)
{
obj.Name = ...
obj.AddressLise1 = ..
obj.PostalCode = ...
if (obj is ChildType)
{
((ChildType)obj).extraField = ...
}
}
答案 2 :(得分:0)
我不是100%确定我理解您正在考虑的“更新方法”,但一般来说,无法以任何方式自定义自动属性。但是你可以在属性的setter中放入你想要的任何代码,只要你为它创建自己的支持字段。
但是,所有属性都有一个集合类型,唯一可以指定其他类型的方法是该类型是否可以赋值给属性类型。
答案 3 :(得分:0)
对于“是”关键字来说,这听起来不错。
void doSomething(BaseType b)
{
if (b is ChildType)
{
// stuff with ChildType's extra properties
}
}
答案 4 :(得分:0)
很难理解你到底需要什么。如果我的猜测是正确的,那么你应该做一些事情(检查方法中的实例类型通常是不好的做法):
void Update(BaseType obj)
{
obj.Name = "aaa";
obj.PostalCode = "123556";
}
void Update(ChildType obj)
{
b.ExtraField = "extra";
Update((BaseType)obj);
}
答案 5 :(得分:0)
不是100%肯定我正在正确地阅读这个问题,但我会给它一个镜头,从这一行得到我的提示:“所以我会传入一个BaseType或一个ChildType;能够访问基本属性对于任何一个对象并做任何逻辑。“
所以让我们假设一个带参数的函数foo。
如果您有foo(BaseType b)
则:
这是一个很好的理由:你的函数采用BaseType,它没有外场,因此它不存在你就不能引用它。
如果可以,那就这样做吧。如果你需要访问extrafield那么你就有一个小问题。
foo的替代形式是foo(ChildType c)
,这意味着:
我首先要考虑的解决方案是将BaseType的签名扩展为包含extrafield。当您的签名在要交替处理的类层次结构的各个级别上保持一致时,多态性最有效。即使extrafield在BaseType中没有多大意义,你可能希望将BaseType抽象化,或者在那里放置一个no-op实现。
我想说如果你的设计要求为子类设置不同的签名,那么将它视为完全可以与BaseType互换时会遇到困难。