【问题标题】:How to convert an object type to a specific type of a generic class如何将对象类型转换为泛型类的特定类型
【发布时间】:2019-06-10 17:01:10
【问题描述】:

我从列表的泛型版本继承以向 asp.net 核心中的另一个泛型类添加一些属性,然后我有一个接收对象参数的方法。在框架工作流程的某个点,它将我的类转换为对象并将其传递给此方法。因此,我需要将对象转换或解析为我继承类的特定类。

    public class ClassList<T> : List<T>
    {
        public int SomeProperty {get; set;}
        ....
    }
    public void SomeMethod(object value){

    }

我需要将 SomeMethod 方法中的对象转换为我创建的泛型类的特定类型。

类似这样的:

    ClassList<OtherClass> otherList = (ClassList<OtherClass>) object;

问题是如何知道泛型类型的类型以及如何在运行时将对象转换为该类型?

【问题讨论】:

  • 99% 的情况下,了解value 类型的最佳方法是将SomeMethod(object value) 更改为SomeMethod(SomeSpecificType value)。现在你知道value 是什么类型了。这是SomeSpecificType。会有其他字面(和正确)的答案告诉你如何做你所要求的,但你可能会从了解为什么这不是一个好问题以及如何避免在第一名。
  • SomeMethod是JsonConverter的WriteJson方法。我不能更改签名。我正在尝试将自定义转换器制作为 API。
  • 请参考这个问题:stackoverflow.com/questions/266115/… 但请记住反射可能会影响代码的性能。
  • 这可能有助于澄清问题 - 并添加更多代码 - 以便有人可以可视化您所描述的类之间的关系。使用一个类、一种方法和一行代码,很难将您所描述的内容拼凑起来。我并不是说这些信息不存在,但它需要有人阅读它几次,然后猜测哪个代码引用了问题的哪个部分,并且可能猜错了。

标签: c# generic-list


【解决方案1】:

没有,因为一直是boxed,只有运行时才能动态知道类是什么。

所以 SomeMethod 在编译之前无法知道泛型类是什么

例如:

这个代码会出错:

CS0411 无法从用法中推断方法“UserQuery.SomeClass.SomeMethod(UserQuery.ClassList)”的类型参数。尝试明确指定类型参数。

public class Program
{
    public static void Main()
    {
        object datas = new ClassList<string>() { "github", "microsoft" };

        var result = SomeClass.SomeMethod(datas);//Error :  CS0411 The type arguments for method 'UserQuery.SomeClass.SomeMethod<T>(UserQuery.ClassList<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
    }
}

public class ClassList<T> : List<T>
{
    public int SomeProperty { get; set; }
}

public class SomeClass
{
    public static ClassList<T> SomeMethod<T>(ClassList<T> value)
    {
        ClassList<T> otherList = (ClassList<T>)value;
        return otherList;
    }
}

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    相关资源
    最近更新 更多