如何使用泛型来解决铸造问题

时间:2012-05-14 07:18:43

标签: c# generics

我有以下情况:

public interface IParam
{
    Object Value {get;set;}
} 

public abstract class BaseClass: IParam
{
    public virtual object Value {get;set;}
}

public class IntSubClass:BaseClass
{
    public override object Value {get;set;}
}

对外界来说,这个界面是暴露的。所有属性都可以通过IParam访问。这种方法的缺点是很多铸造问题。

IParam dummy = ParameterList[abc];
int index = (int)dummy.Value;

请求请告知如何使用泛型来解决此问题。在外面,我只能暴露通用接口。

3 个答案:

答案 0 :(得分:1)

如果我们假设参数可以是不同类型,那么简单地说:不。

哦,你可以介绍泛型......但这只是改变了

的东西
int val = (int)(paramList["abc"].Value);

为:

int val = ((IParam<int>)paramList["abc"]).Value;

并没有多大帮助。唯一的另一个选择是隐式转换运算符,其中a:不适用于interface s,而b:不是非常清晰/明显。

坦率地说,我只是使用演员阵容。这不是问题。盒子/拆箱不是非常昂贵,而且代码的目的很明确。

答案 1 :(得分:0)

您可以创建具有IParam<T>方法的T Value {get; set;}界面。这会解决你的问题吗?你将无法转换为IParam,而是在/

周围传递正确的IParam

答案 2 :(得分:0)

如果在内部你必须在一个列表中保存所有类型的参数,那么,你只能通过它们的公共基本类型访问它们。

你可以在内部将参数保存在单独的列表中,每个列表都属于某种类型,但在你的场景中这可能是一种过度杀伤。