【问题标题】:Method input parameter as namespace [closed]作为命名空间的方法输入参数
【发布时间】:2014-07-19 06:19:54
【问题描述】:

假设我有这些对象

namespace MyResponses.Interfaces.IInterface1
{
    partial class exResponse
    {
        Object1 myObj; 
        bool flag;
    }
}

namespace MyResponses.Interfaces.IInterface2
{
    partial class exResponse
    {
        Object2 myObj;
        bool flag;
    }
}

namespace MyResponses.Interfaces.IInterface3
{
    partial class exResponse
    {
        Object3 myObj; 
        bool flag;
    }
}

我需要一种方法来检查所有 exResponse 对象中的标志。 此方法将在 MyResponses.Interfaces 命名空间中接收一个对象。

类似:

bool CheckFlagInResponse(MyResponses.Interfaces response, Type responseType)
{
    return (response as responseType).flag;
}

我会这样称呼它吗?

CheckFlagInResponse(myExResponse, myExResponse.GetType())

【问题讨论】:

  • “这些对象”是什么意思?您的意思是您实际上有三种不同的类型,都称为exResponse 并且都带有flag 字段或属性?首先,我会避免这样做。
  • 所有这些都是来自不同 Web 服务的不同响应,我没有实现 :)
  • 我对什么是命名空间、什么是类型以及什么是成员感到困惑。

标签: c# .net .net-3.5


【解决方案1】:

如果你有非常相似的类型都具有相同的成员(甚至是相同的简单名称)但它们之间没有类型关系,这听起来基本上是被设计破坏的。

如果这是生成的代码,并且在生成的代码中所有类型都声明为 partial 类型,您可以通过让它们都实现一个接口来解决这个问题:

public interface IFlag
{
    bool Flag { get; }
}

namespace MyResponses.Interfaces.IInterface1
{
    public partial class ExResponse : IFlag {}
}

namespace MyResponses.Interfaces.IInterface2
{
    public partial class ExResponse : IFlag {}
}

// etc

然后,您可以将IFlag 用于需要访问标志的任何内容 - 所有响应类都将实现该接口。

或者,如果您真的必须这样做(并且如果您使用的是 .NET 4,现在听起来好像不是),您可以只使用动态类型:

bool CheckFlagInResponse(dynamic response)
{
    return response.flag;
}

【讨论】:

  • 我更新了我的问题.. 不知道是否有帮助
  • 动态语句不起作用,因为我使用的是 .NET 3.5
  • @HélderGonçalves:将来,请在问题中明确此类限制。听起来部分类方法会起作用。
猜你喜欢
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多