C#方法签名对象引用

时间:2011-09-12 19:20:47

标签: c#

假设我有一个基类和这样的孩子:

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服务就是我要做的。

所以我会传递BaseTypeChildType;能够访问任一对象的基本属性,并做任何逻辑。

我正在尝试减少重复的代码。

6 个答案:

答案 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  
   }
}

is keyword

答案 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或ChildType
  • 的实例
  • 您可以访问BaseType
  • 上定义的所有属性
  • 但是你不能在没有荒谬的铸造恶作剧的情况下进入外场成员

这是一个很好的理由:你的函数采用BaseType,它没有外场,因此它不存在你就不能引用它。

如果可以,那就这样做吧。如果你需要访问extrafield那么你就有一个小问题。

foo的替代形式是foo(ChildType c),这意味着:

  • 您只能接受ChildType的实例,而不能接受BaseType的实例
  • 但您可以访问任何属性,包括姓名和字段

我首先要考虑的解决方案是将BaseType的签名扩展为包含extrafield。当您的签名在要交替处理的类层次结构的各个级别上保持一致时,多态性最有效。即使extrafield在BaseType中没有多大意义,你可能希望将BaseType抽象化,或者在那里放置一个no-op实现。

我想说如果你的设计要求为子类设置不同的签名,那么将它视为完全可以与BaseType互换时会遇到困难。