C# 泛型类工厂问题

C# 泛型类工厂问题,c#,oop,C#,Oop,下面是我的代码的简化版本: public interface IControl<T> { T Value { get; } } public class BoolControl : IControl<bool> { public bool Value { get { return true; } } } public class StringControl : IControl<string> { p

下面是我的代码的简化版本:

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;
    }
}
公共接口IControl
{
T值{get;}
}
公共类BoolControl:IControl
{
公共布尔值
{
获取{return true;}
}
}
公共类StringControl:IControl
{
公共字符串值
{
获取{return”“;}
}
}
公共类控制工厂
{
公共IControl GetControl(字符串控制类型)
{
开关(控制型)
{
案例“Bool”:
返回新的BoolControl();
大小写“字符串”:
返回新的StringControl();
}
返回null;
}
}
问题出在ControlFactory类的GetControl方法中。因为它返回IControl,而我只有IControl是一个通用接口。我不能提供T,因为在Bool的情况下,它是Bool,在String的情况下,它是String


你知道我需要做什么才能让它工作吗?

只要从
IControl
派生
IControl

public interface IControl<T> : IControl
{
    T Value { get; }
}
现在的问题是,新控件不能隐式地强制转换为
IControl
,您必须将其显式转换

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;
    }
}
public IControl GetControl()
{
if(typeof(T)=typeof(Boolean))
{
返回新的(IControl)BoolControl();
}
else if(typeof(T)=typeof(String))
{
返回(IControl)新的StringControl();
}
其他的
{
返回null;
}
}
更新

将强制转换从作为IControl的
更改为
(IControl)
。这是首选的,因为当IControl以静默方式返回
null
public IControl GetControl()时,如果出现错误,则会导致异常
public IControl<T> GetControl<T>()
{
    switch (typeof(T).Name)
    {
        case "Bool":
            return (IControl<T>) new BoolControl();
        case "String":
            return (IControl<T>) new StringControl();
    }
    return null;
}
{ 开关(类型(T).名称) { 案例“Bool”: 返回(IControl)新BoolControl(); 大小写“字符串”: 返回(IControl)新的StringControl(); } 返回null; }
更新;更正了代码中的几个错误。下面是一个获得课程的呼叫:

IControl<bool> boolControl = GetControl<bool>();
IControl boolControl=GetControl();

返回类型必须是泛型的,因为它是泛型的。想想你会如何使用这个。返回强类型对象可以避免使用泛型工厂方法

即使你能做到,你的收获是什么

IControl<bool> boolControl = controlFactory.GetControl("bool");
IControl boolControl=controlFactory.GetControl(“bool”);
或者,一个有效的方法

IControl<bool> boolControl = controlFactory.GetControl<bool>("bool");
IControl boolControl=controlFactory.GetControl(“bool”);
在特定的时间内

IControl<bool> boolControl = controlFactory.GetBoolControl("bool");
IControl boolControl=controlFactory.GetBoolControl(“bool”);

无论哪种方式,您都可以在客户端使用开关()。要么返回对象,要么使用非类型IControl接口。

@Vadim-我强烈建议您使用Daniel的解决方案,他在比较类型,而不是使用字符串。使用类型的名称更容易出错。@Jon B:你说得对;比较这些类型将提供更健壮的代码。我只是简单地更新了瓦迪姆的原始代码。丹尼尔的方法是更好的方法。
IControl<bool> boolControl = controlFactory.GetBoolControl("bool");