c#方法签名对象引用
本文关键字:对象引用 方法 | 更新日期: 2023-09-27 18:08:27
假设我有这样一个基类和子类:
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
;能够访问任意一个对象的基本属性并执行任何逻辑。
我正在努力减少代码的重复。
您可以使用BaseType
作为方法的参数:
void DoSomethingWithType(BaseType instance)
{
// Do something here..
Console.WriteLine(instance.Name);
}
你可以这样写:
ChildType child = new ChildType() { Name = "Foo"; }
DoSomethingWithType(child);
void SetMethod(BaseType obj)
{
obj.Name = ...
obj.AddressLise1 = ..
obj.PostalCode = ...
if (obj is ChildType)
{
((ChildType)obj).extraField = ...
}
}
我不能100%确定我理解你所指的"更新方法",但一般情况下,自动属性不能以任何方式自定义。然而,你可以在属性的setter中放入任何你想要的代码,只要你为它创建了自己的支持字段。
听起来像是"is"关键字的好例子。
void doSomething(BaseType b)
{
if (b is ChildType)
{
// stuff with ChildType's extra properties
}
}
是关键字
很难理解你到底需要什么。如果我的猜测是正确的,那么您应该这样做(检查方法中的实例类型通常是不好的做法):
void Update(BaseType obj)
{
obj.Name = "aaa";
obj.PostalCode = "123556";
}
void Update(ChildType obj)
{
b.ExtraField = "extra";
Update((BaseType)obj);
}
不是100%确定我正确地阅读了这个问题,但我会给它一个机会,从这行中得到提示:"所以我会传递一个BaseType或ChildType;能够访问任何一个对象的基本属性并执行任何逻辑。"
假设有一个带形参的函数foo
如果你有foo(BaseType b)
,那么:
- 可以传递一个BaseType或ChildType的实例
- 可以访问BaseType 上定义的所有属性
- 但是你不能访问外域成员没有荒谬的铸造诡计
这是一个很好的理由:你的函数接受BaseType,它没有额外的字段,所以因为它不存在,你不能引用它。
如果可以,那么就这样做。如果你需要访问外域,那么你有一个小问题。
foo的另一种形式是foo(ChildType c)
,这意味着:
- 只能接受ChildType的实例,不能接受BaseType的实例
- 但是你可以访问任何属性,包括Name和extrfield
我在这里首先考虑的解决方案是扩展BaseType的签名以包含外字段。当您的签名在您希望互换处理的类层次结构的各个级别上保持一致时,多态效果最好。即使extrafield在BaseType中没有多大意义,您也可能希望将BaseType抽象,或者在那里放置一个无操作的extrafield实现。
我想说的是,如果您的设计要求为子类提供不同的签名,那么您将很难将其视为与BaseType完全可互换的