我可以在C#中使用未知类型的参数声明方法来创建接口或抽象类吗?

时间:2010-02-22 13:03:38

标签: c# inheritance interface abstract-class

我正在将http GET查询字符串解析为其组件。在尝试使其模块化(参数的数量和类型可以变化很大)时,我希望有一个参数抽象基类或接口来定义是否已设置属性,以及设置方法的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()和切换魔术,虽然这让我觉得非常难看,而且非多态,可以这么说。

还有其他想法吗? :)

1 个答案:

答案 0 :(得分:10)

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

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