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

时间:2010-08-14 05:51:08

标签: .net vb.net generics reflection

我已经把自己变成了泡菜,并且可以使用古茹的帮助......

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

Journal(Of ParentT)

- 家长可以是CustomerAddress,其他班级

Journal的构造函数需要了解Type参数:

Public Sub New(Parent as ParentT)

在我的消费形式中,我在构造函数中使用Journal:

Public Sub DisplayForm(Journal as object)

此时,我无法确定期刊的类型。我已经看过使用带MethodInfo>的反射MakeGenericMethodDynamicMethod,代表等,但尚未找到可行的解决方案。

此时我愿意考虑大多数选择......

2 个答案:

答案 0 :(得分:1)

我可能误解了这个问题,但如果我理解正确,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 
{
    ...
}

答案 1 :(得分:0)

我知道我参加这个派对有点晚了,但我以为我会参加比赛。

您可以在此处使用许多基于非反思的方法。

您传递日志的DisplayMethod调用不是表单的构造函数(否则它将被称为New)所以我假设它是一种方法,可以确定哪种形式加载以显示日记。

如果是这样,您可以简单地将泛型参数添加到此方法调用中,如下所示:

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

由于你正在使用IoC,你甚至可以更进一步。像这样:

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)并在Journal上具有ParentType属性。或者,您可以使用IJournal接口执行相同的操作。