贝娄是我的代码的简化版本:

public interface IControl<T>
{
    T Value { get; }
}

public class BoolControl : IControl<bool>
{
    public bool Value
    {
        get { return true; }
    }
}

public class StringControl : IControl<string>
{
    public string Value
    {
        get { return ""; }
    }
}
public class ControlFactory
{
    public IControl GetControl(string controlType)
    {
        switch (controlType)
        {
            case "Bool":
                return new BoolControl();
            case "String":
                return new StringControl();
        }
        return null;
    }
}

问题出在ControlFactory类的GetControl方法中。因为它返回IControl,而我只有IControl ,这是一个通用接口(interface)。我不能提供T,因为在Bool情况下它将变为 bool 值,在String情况下将变为字符串。

知道我需要做什么才能使其正常工作吗?

最佳答案

只需从IControl<T>导出IControl即可。

public interface IControl<T> : IControl
{
    T Value { get; }
}

更新

如果我错过了您,并且不想使用非通用接口(interface),则也必须使GetControl()方法通用。
public IControl<T> GetControl<T>()
{
    if (typeof(T) == typeof(Boolean))
    {
        return new BoolControl(); // Will not compile.
    }
    else if (typeof(T) == typeof(String))
    {
        return new StringControl(); // Will not compile.
    }
    else
    {
        return null;
    }
}

现在,您遇到的问题是无法将新控件隐式转换为IControl<T>,而您必须将其明确显示。
public IControl<T> GetControl<T>()
{
    if (typeof(T) == typeof(Boolean))
    {
        return new (IControl<T>)BoolControl();
    }
    else if (typeof(T) == typeof(String))
    {
        return (IControl<T>)new StringControl();
    }
    else
    {
        return null;
    }
}

更新

将类型转换从as IControl<T>更改为(IControl<T>)。这是首选方法,因为如果as IControl<T>静默返回null时出现错误,它将导致异常。

关于c# - 通用类工厂问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/803853/

10-11 02:12