【问题标题】:Can I make interfaces or abstract classes in C# that declare methods with a parameter of unknown type?我可以在 C# 中创建接口或抽象类来声明具有未知类型参数的方法吗?
【发布时间】:2010-02-22 13:03:37
【问题描述】:

我正在将一个 http GET 查询字符串解析为其组件。在尝试使其模块化(参数的数量和类型可能会有很大差异)时,我想要一个 Parameter 抽象基类或接口来定义是否已设置属性,以及设置属性的 Set 方法价值。有没有办法使用 Set 方法的可变参数类型来做到这一点?

大致思路如下:

public abstract class Parameter
{
    public bool IsSet { get; protected set; }
    protected Parameter() { IsSet = false; }
    public abstract void Set( --unknown type here-- );
}

示例参数 child 将类似于:

public class IntParameter : Parameter
{
    public int Value { get; protected set; }
    public void Set(int value)
    {
        Value = value;
        IsSet = true;
    }
}

使用这种结构,我可以将每个查询参数扔到其适当的强类型类中,但仍要确保所有参数的行为一致。 IsSet 属性的原因是能够检查参数是否已设置,因为某些参数没有任何“安全”值,我肯定知道这些值不是有意传递的。如果没有设置一个值,那么它将获得一个默认值。

看着这个问题,我怀疑它是否可以按照我想要实现的方式处理,但是这个例子应该让我明白我想要做什么。

对于如何最好地处理它有什么建议吗?如果有一种方便的设计模式或通用的方法,我不会感到惊讶,但我还没有设法谷歌。

我看到的选项是:

  • 不要使用继承,而是依靠约定来保持一致性。我很可能不需要通过列表迭代等来处理这些,但如果我找到了一种方法,它可能会带来一些新的想法或机会。
  • 使用对象参数,然后执行一些 typeof() 并以某种方式切换魔法,尽管这让我觉得非常丑陋,可以说是非多态的。

还有其他想法吗? :)

【问题讨论】:

  • 是的,我应该意识到这一点。没有马上注意到你的评论。下面的答案已经很清楚了。 :)

标签: c# inheritance interface abstract-class


【解决方案1】:

您是否正在寻找类似的东西

public abstract class Parameter<T>
{ 
    public bool IsSet { get; protected set; } 
    protected Parameter() { IsSet = false; } 
    public abstract void Set(T value);
    public T Value;
}
public class IntParameter : Parameter<int>
{
    public override void Set(int value)
    {
        Value = value;
        IsSet = true;
    }
}

看看An Introduction to C# Generics

【讨论】:

  • 伙计,问一个愚蠢的问题...这正是我所需要的。泛型应该是我首先想到的。 :) 非常感谢!
  • 作为附加评论,使用泛型我什至不再需要继承,但只需一个类就可以做到这一点,这更好。 :)
  • 只是一个挑剔:我会将 T Value 字段封装到一个带有受保护集的属性中。我们不想在Set() 方法之外到处更改Value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2013-05-22
  • 1970-01-01
  • 2018-05-08
  • 2013-12-30
相关资源
最近更新 更多