代码之家  ›  专栏  ›  技术社区  ›  grefly

在非泛型类的运行时确定泛型类型

  •  1
  • grefly  · 技术社区  · 16 年前

    我已经陷入困境,可以借助一位大师的帮助…

    我有一个日志记录不同类型的条目:

    Journal(Of ParentT)
    

    -父级可以是 Customer , Address 其他类

    日志的构造函数需要类型参数的知识:

    Public Sub New(Parent as ParentT)
    

    在我的消费形式中,我在构造函数中取了一个日志:

    Public Sub DisplayForm(Journal as object)
    

    此时,我无法确定日记账的类型。我已经研究过使用反射 MethodInfo gt; MakeGenericMethod , DynamicMethod ,代表等,但没有找到可行的解决方案。

    在这一点上,我愿意考虑大多数的选择…

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ani    16 年前

    我可能误解了这个问题,但如果我理解正确, Journal 实际上是具有泛型参数的泛型类 ParentT ;它只是指 Journal<ParentT> 实例是非泛型的 System.Object 类型。在这种情况下,以下方法应该可以正常工作:

    System.Type.GetGenericArguments

    很抱歉,此代码是C,但:

     object obj = new List<int>();
     Console.WriteLine(obj.GetType().GetGenericArguments().First().ToString());
    

    输出:

    System.Int32
    

    在您的情况下,您可能需要如下内容:

    Type journalGenericType = myJournal.GetType().GetGenericArguments().First();
    
    if (journalGenericType == typeof(Customer))
    {
        ...
    }
    else 
    {
        ...
    }
    
        2
  •  0
  •   Enigmativity    15 年前

    我知道我参加这个聚会有点晚了,但我想我会参加的。

    这里有许多基于非反射的方法可以使用。

    这个 DisplayMethod 将日志传递给的调用不是窗体的构造函数(否则它将被调用 New )所以我假设这是一种方法,可以计算出要加载哪个表单来显示日志。

    如果是这样,您可以像这样简单地向该方法调用添加泛型参数:

    Public Sub DisplayForm(Of ParentT)(Journal As Journal(Of ParentT))
       Dim JournalParentType = GetType(ParentT)
       '...
    End Sub
    

    既然你在使用国际奥委会,你甚至可以更进一步。像这样:

    Public Sub DisplayForm(Of ParentT)(Journal As Journal(Of ParentT))
       Dim form = ioc.Resolve(Of IForm(Of ParentT))
       form.DataSource = Journal.Parent
       form.Show()
    End Sub
    

    当然,你需要定义你自己的 IForm(Of T) 接口来完成这项工作-但现在不需要反射。

    另一种方法是 Journal 基类 Journal(Of ParentT) 并且有一个 ParentType 日记帐上的属性。或者你可以有一个 IJournal 执行相同操作的接口。