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

McM*_*ons 3 c# inheritance abstract-class interface

我正在将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-- );
}
Run Code Online (Sandbox Code Playgroud)

一个示例参数子将是这样的:

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

通过这种结构,我可以将每个查询参数抛入其适当的强类型类中,但仍然确保所有这些都是一致的.IsSet属性的原因是能够检查参数是否已设置,因为某些参数没有任何"安全"值,我肯定不会故意传递这些值.如果未设置值,则会获得一个默认值.

看看这个问题,我怀疑它是否可以像我想要实现它那样处理,但是这个例子应该能够了解我希望能够做到的事情.

有没有关于如何最好地处理它的建议.如果有一个方便的设计模式或常见的方式,我不会感到惊讶,但我没有设法谷歌一个.

我看到的选项是:

  • 不要使用继承并依赖约定来保持一致性.我很可能不需要通过列表迭代等处理这些,但如果我找到了一种方法,它可能会打开一些新的想法或机会.
  • 使用一个object参数,然后以某种方式做一些typeof()和切换魔法,虽然这让我感到非常难看,而且非多态,可以这么说.

还有其他想法吗?:)

Adr*_*der 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

看看C#Generics简介