相当于Java的C#<F扩展FieldType <?>> void add(F field)

时间:2019-09-01 02:57:05

标签: c# generic-programming

我是C#的新手,很抱歉,如果有人已经问过这个问题,我没有找到任何答案。

标题中的问题很清楚,所以这是我要实现的代码:

/// <typeparam name="M">Entity model</typeparam>
public class FormBuilder<M>
{

    /// <typeparam name="F">Implementation of FieldType</typeparam>
    public FormBuilder<M> Add<F>(string propertyName, F options) where F : FieldType<?>
    {
        // ...
        return this;
    }

}

/// <typeparam name="T">Type of the field</typeparam>
public abstract class FieldType<T>
{
    public T Data { get; set; }
    public bool Disabled { get; set; } = false;
    public bool Required { get; set; } = true;
    public string Hint { get; set; }
    public IDictionary<string, string> Attributes { get; set; }
}

public class TextType : FieldType<string>
{
    public bool Trim { get; set; } = true;
    public string Placeholder { get; set; }
}

1 个答案:

答案 0 :(得分:4)

由于C#的泛型是经过 reified 的,而Java使用类型擦除来实现其泛型,因此在某些类似的极端情况下会出现一些基本差异。长话短说:您需要为FieldType<>指定一个实际的泛型类型。好消息是您可以通过泛型来做到这一点。

public FormBuilder<M> Add<F, T>(string propertyName, F options) where F : FieldType<T>
{
    // ...
    return this;
}

当然,您需要考虑是否真的需要F泛型类型。根据您的操作,很可能可以摆脱一些更简单的事情:

public FormBuilder<M> Add<T>(string propertyName, FieldType<T> options)
{
    // ...
    return this;
}