贝娄是我的代码的简化版本:
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/