Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类型未知的泛型对象列表_C#_Generics - Fatal编程技术网

C# 类型未知的泛型对象列表

C# 类型未知的泛型对象列表,c#,generics,C#,Generics,我有以下两门课。ConvertToType类是一个现有类,可以正常工作,但是每次使用它时都会创建一个实例(通过反射),因此我创建一个包装类来保存所有实例,因为它们是为了提高效率而创建的 public class TypeConverterHelper { private IList<ConvertToType<>> types; } internal class ConvertToType<T> { //snip } 公共类TypeConv

我有以下两门课。
ConvertToType
类是一个现有类,可以正常工作,但是每次使用它时都会创建一个实例(通过反射),因此我创建一个包装类来保存所有实例,因为它们是为了提高效率而创建的

public class TypeConverterHelper
{
    private IList<ConvertToType<>> types;
}

internal class ConvertToType<T>
{
    //snip
}
公共类TypeConverterHelper
{
私有IList类型;
}
内部类转换类型
{
//剪断
}
但是,正如您所看到的,我需要一个我的
ConvertToType
类的列表,但是我不能指定类型,因为这些类的全部要点是直到运行时才知道类型。我对这个问题进行了大量的研究,但没有找到一个成功的解决方案。我知道我可以将泛型类型设置为一个对象,但在那里,您可能会在某个时候遇到取消/装箱问题。添加一个仅限于
结构的接口/抽象基类
看起来是个不错的选择,但不幸的是
T
可能是一个字符串,也可能是以后的其他自定义类,因此解决方案不起作用


那么有人有其他的解决方案/建议吗?

列表类型必须是非泛型的(因为泛型类型参数无法预测),所以
对象就可以了,但最好使用通用的非泛型基。装箱/取消装箱不在讨论范围内,因为
ConvertToType
是一种引用类型

当然,您必须将列表中的值转换回
ConvertToType
,然后才能使用它们;实现可以如下所示:

public class TypeConverterHelper
{
    private IList<object> types;

    public ConvertToType<T> GetConverter<T>()
    {
        return types.OfType<ConvertToType<T>>.FirstOrDefault();
    }
}
公共类TypeConverterHelper
{
私有IList类型;
公共ConvertToType GetConverter()
{
返回类型。of type.FirstOrDefault();
}
}

列表类型必须是非泛型的(因为无法预测泛型类型参数),因此
对象可以,但最好使用通用的非泛型基。装箱/取消装箱不在讨论范围内,因为
ConvertToType
是一种引用类型

当然,您必须将列表中的值转换回
ConvertToType
,然后才能使用它们;实现可以如下所示:

public class TypeConverterHelper
{
    private IList<object> types;

    public ConvertToType<T> GetConverter<T>()
    {
        return types.OfType<ConvertToType<T>>.FirstOrDefault();
    }
}
公共类TypeConverterHelper
{
私有IList类型;
公共ConvertToType GetConverter()
{
返回类型。of type.FirstOrDefault();
}
}

列表类型必须是非泛型的(因为无法预测泛型类型参数),因此
对象可以,但最好使用通用的非泛型基。装箱/取消装箱不在讨论范围内,因为
ConvertToType
是一种引用类型

当然,您必须将列表中的值转换回
ConvertToType
,然后才能使用它们;实现可以如下所示:

public class TypeConverterHelper
{
    private IList<object> types;

    public ConvertToType<T> GetConverter<T>()
    {
        return types.OfType<ConvertToType<T>>.FirstOrDefault();
    }
}
公共类TypeConverterHelper
{
私有IList类型;
公共ConvertToType GetConverter()
{
返回类型。of type.FirstOrDefault();
}
}

列表类型必须是非泛型的(因为无法预测泛型类型参数),因此
对象可以,但最好使用通用的非泛型基。装箱/取消装箱不在讨论范围内,因为
ConvertToType
是一种引用类型

当然,您必须将列表中的值转换回
ConvertToType
,然后才能使用它们;实现可以如下所示:

public class TypeConverterHelper
{
    private IList<object> types;

    public ConvertToType<T> GetConverter<T>()
    {
        return types.OfType<ConvertToType<T>>.FirstOrDefault();
    }
}
公共类TypeConverterHelper
{
私有IList类型;
公共ConvertToType GetConverter()
{
返回类型。of type.FirstOrDefault();
}
}


我将创建一个非通用标记接口,
IConvertToType
,并让
ConvertToType
实现它,而不是将其存储为一个容易出错的
IList
。然后您可以将其存储为
IList
@AvnerShahar-Kashtan:虽然这可能也是我要做的,但在我看来,唯一的实际好处是代码将更加自文档化(建议的接口似乎完全是空的)。列表是私有的,很可能只有一个对
类型的调用。在所有
类型转换器帮助中添加
;在那里写一个bug有点困难。没错,但自我记录本身就是一个公平的目标。@Avnershaar Kashtan:同意这点。@Jon非常感谢你的回答,在做了一点修改后,我让它工作了。我还采纳了@AvnerShahar Kashtan的建议,创建一个标记接口,而
类型确实如此。Add
只使用一次,我更喜欢尽可能使用
对象
以外的东西。再次感谢。与其将其存储为易于出错的IList,我将创建一个非通用标记接口,
IConvertToType
,并让
ConvertToType
实现它。然后您可以将其存储为
IList
@AvnerShahar-Kashtan:虽然这可能也是我要做的,但在我看来,唯一的实际好处是代码将更加自文档化(建议的接口似乎完全是空的)。列表是私有的,很可能只有一个对
类型的调用。在所有
类型转换器帮助中添加
;在那里写一个bug有点困难。没错,但自我记录本身就是一个公平的目标。@Avnershaar Kashtan:同意这点。@Jon非常感谢你的回答,在做了一点修改后,我让它工作了。我还采纳了@AvnerShahar Kashtan的建议,创建一个标记接口,而
类型确实如此。Add
只使用一次,我更喜欢尽可能使用
对象
以外的东西。再次感谢。与其将其存储为易于出错的IList,我将创建一个非通用标记接口,
IConvertToType
,并让
ConvertToType
实现它。然后您可以将其存储为
IList
@AvnerS