需要访问从通用抽象基派生的 类 中的重写抽象 属性 的接口吗?

Interface needed to access overridden abstract property in classes derived from generic abstract base?

所以我的困境是,为了从 UtilityThing<T> 访问 IntThingStringThingMyProperty,我定义了一个接口 MyProperty 并将其用作 UtilityThing<T>T 的通用约束。这是有效的,但考虑到相同的 属性 已经在抽象基础中定义,这似乎是多余的。我是否遗漏了设计的某个方面,或者这实际上是在这种情况下需要完成的方式吗?

public interface IThing {
    string MyProperty { get; set; } 
}

public abstract class Thing<T> {
    protected string _MyProperty;
    public abstract string MyProperty { get; set; }
    public T OtherProperty { get; set; }

    public string CommonMethod() {
        return MyProperty + "foobar";   
    }
}

public class IntThing : Thing<int?>, IThing {
    public override string MyProperty {
        get { return _MyProperty; }
        set { _MyProperty = value + OtherProperty.ToString(); }
    }
}

public class StringThing: Thing<string>, IThing {
    public override string MyProperty {
        get { return _MyProperty; }
        set { _MyProperty = OtherProperty + value; }
    }
}

public class UtilityThing<T> where T: IThing, new() {
    public T DoIt(SomeContext someContext, string name) {
        string contextVal = someContext.GetValue(name);

        var thing = new T { MyProperty = contextVal }
        return thing;
    }
}

您需要引入新的通用类型。一旦引入新类型,您就可以消除对接口的需求。

public class UtilityThing<T, I> where T : Thing<I>, new()
{
    public T DoIt(SomeContext someContext, string name)
    {
        string contextVal = someContext.GetValue(name);

        var thing = new T { MyProperty = contextVal };
        return thing;
    }
}

你可以这样使用它:

var utility = new UtilityThing<IntThing, int?>();