我已经把自己变成了泡菜,并且可以使用古茹的帮助......
我有一个记录不同类型条目的日记:
Journal(Of ParentT)
- 家长可以是Customer
,Address
,其他班级
Journal的构造函数需要了解Type参数:
Public Sub New(Parent as ParentT)
在我的消费形式中,我在构造函数中使用Journal:
Public Sub DisplayForm(Journal as object)
此时,我无法确定期刊的类型。我已经看过使用带MethodInfo
>的反射MakeGenericMethod
,DynamicMethod
,代表等,但尚未找到可行的解决方案。
此时我愿意考虑大多数选择......
答案 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
接口执行相同的操作。