接口是否可以要求属性,但不能指定所需的类型

本文关键字:类型 但不能 是否 属性 接口 | 更新日期: 2023-09-27 18:29:19

我有一个简单的接口,定义如下:

interface iFace
{
   int Value { get; }
}

在这种情况下,任何实现iFace的类都必须有一个名为Value的int类型的属性。这个接口的用途是数据绑定,我不在乎这个属性是什么类型。我有任何选择吗?我想避免这种解决方案:

interface iFace<T>
{
   T Value { get; }
}

因为我想在不指定类型的情况下引用接口

编辑:

我希望能够将相同的接口应用于NumericUpDown控件和Trackbar控件。一个的value属性是decimal类型,另一个是int类型。

在这种情况下,将属性设置为object类型是不起作用的。

接口是否可以要求属性,但不能指定所需的类型

如果您不在乎它是否是严格类型的,请将属性类型更改为object。

试试这个:

interface MyInterface
{
    Object MyProperty
    {
        get;
        set;
    }
}
class MyClass : MyInterface
{
    Object MyInterface.MyProperty
    {
        get
        {
            return this.MyProperty;
        }
        set
        {
            if (value is MyType)
                this.MyProperty = (MyType)value;
        }
    }
    public MyType MyProperty
    {
        get;
        set;
    }
}

针对您的编辑:您遇到了一个众所周知的问题,即.NET没有INumeric接口。它存在于我看到的源代码中,但它已经被注释掉了,这意味着微软已经足够认真地对待它,并遇到了一些重大问题

Danny Varod的解决方案很好;您还可以通过创建通用的接口的非通用版本来扩展它。另一种解决方案是在接口中添加表示数字运算的方法,例如Increment()

我将在这里调用接口IHasValue(部分原因是它有点滑稽):

interface IHasValue
{
    object Value { get; set; }
    void Increment();
    void Decrement();
}
interface IHasValue<TValue> : IHasValue { new TValue Value { get; set; } }
abstract class UpDownValueControl<T> : IHasValue<T>
{
    public T Value { get; set; }
    object IHasValue.Value
    {
         get { return this.Value; }
         set { this.Value = (T)value; }
    }
    public abstract void Increment();
    public abstract void Decrement();
}
class NumericUpDownControl : UpDownValueControl<decimal>
{
    public override void Increment() { Value++; }
    public override void Decrement() { Value--; }
    //rest of the implementation
}
class TrackbarControl : UpDownValueControl<int>
{
    public override void Increment() { Value++; }
    public override void Decrement() { Value--; }
    //rest of the implementation
}

令人沮丧的是,基类不能像递增和递减方法那样处理重复的代码,但至少这种方法允许基类处理除了重复的数学运算符代码之外的所有其他代码。

最后,我怀疑这种解决方案的复杂性增加的成本大于收益;我想我更有可能采用Danny Varod的解决方案。

相关文章: