C# MakeGenericType()实际上生成了一个对象,我不能使用类型';s方法
归根结底,我试图创建一个泛型,当类型在运行时正确显示时,在编译时它仍然是C# MakeGenericType()实际上生成了一个对象,我不能使用类型';s方法,c#,generics,C#,Generics,归根结底,我试图创建一个泛型,当类型在运行时正确显示时,在编译时它仍然是对象,因此我不能使用任何泛型类型的方法 多亏了前一个问题上的无脑编码员,我才能够前进一点 使用系统; 使用System.Collections.Generic; 使用System.Linq; 公共课程 { 公共静态void Main() { var-sample=new-Baz(); 样品。剂量测定(); } 公开课Foo { } 公共类酒吧 { 公共部门 { } } 公共类Baz { 公共无效剂量测定法(){ if(t
对象
,因此我不能使用任何泛型类型的方法
多亏了前一个问题上的无脑编码员,我才能够前进一点
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
var-sample=new-Baz();
样品。剂量测定();
}
公开课Foo
{
}
公共类酒吧
{
公共部门
{
}
}
公共类Baz
{
公共无效剂量测定法(){
if(typeof(T).Name==“列表'1”)
{
var typeName=typeof(T).GetGenericArguments().Single().FullName;
var type=type.GetType(typeName);
var genericRepoType=类型(条形);
var specificRepoType=genericRepoType.MakeGenericType(新类型[]{Type});
var genericBar=Activator.CreateInstance(specificRepoType);
Console.WriteLine(genericBar.GetType().Name);//显示Bar`1
//但在编译时,它的foo仍然是一个对象
genericBar.Boom();
//“对象”的will error不包含Boom的定义
}
}
}
}
这听起来像是一个非常有问题的设计,但如果必须的话,dynamic
巧妙地解决了您的问题
public static void Main() {
var sample = new Baz<List<Foo>>();
sample.DoSomething();
}
public class Foo { }
public class Bar<T> {
public void Boom() {
Console.WriteLine("I am booming");
}
}
public class Baz<T> {
public void DoSomething() {
var typeName = typeof(T).GetGenericArguments().Single().FullName;
var type = Type.GetType(typeName);
var genericRepoType = typeof(Bar<>);
var specificRepoType = genericRepoType.MakeGenericType(new Type[] { type });
dynamic genericBar = Activator.CreateInstance(specificRepoType);
Console.WriteLine(genericBar.GetType().Name);
genericBar.Boom();
}
}
这听起来像是一个非常有问题的设计,但如果必须的话,
dynamic
巧妙地解决了您的问题
public static void Main() {
var sample = new Baz<List<Foo>>();
sample.DoSomething();
}
public class Foo { }
public class Bar<T> {
public void Boom() {
Console.WriteLine("I am booming");
}
}
public class Baz<T> {
public void DoSomething() {
var typeName = typeof(T).GetGenericArguments().Single().FullName;
var type = Type.GetType(typeName);
var genericRepoType = typeof(Bar<>);
var specificRepoType = genericRepoType.MakeGenericType(new Type[] { type });
dynamic genericBar = Activator.CreateInstance(specificRepoType);
Console.WriteLine(genericBar.GetType().Name);
genericBar.Boom();
}
}
你到底想对这个对象做什么?如果你知道它是一种特殊的类型,那么就直接对它进行强制转换。如果您不知道类型,编译器应该如何知道?您可以查看
动态
(使用动态genericBar=…
),但如果您可以选择强类型,我不喜欢使用动态代码。不清楚你是否这样做。也许你真的想要一个通用的方法?(public void DoSomething(),其中T:new()
如果需要执行new T()
)@ton.yeung,那么您希望如何对其调用方法?您希望看到什么genericBar.Boom()代码>如果T是列表
?反射一直是海龟,您必须使用genericBar.GetType().GetMethod(“Boom”)。使用dynamic是阻止海龟的一个非常明显的替代方法。您如何知道如何将“Boom”传递给GetMethod()?你必须知道一些事情。你到底想对这个对象做什么——如果你知道它是一种特殊的类型,那么就直接对它进行强制转换。如果您不知道类型,编译器应该如何知道?您可以查看动态
(使用动态genericBar=…
),但如果您可以选择强类型,我不喜欢使用动态代码。不清楚你是否这样做。也许你真的想要一个通用的方法?(public void DoSomething(),其中T:new()
如果需要执行new T()
)@ton.yeung,那么您希望如何对其调用方法?您希望看到什么genericBar.Boom()代码>如果T是列表
?反射一直是海龟,您必须使用genericBar.GetType().GetMethod(“Boom”)。使用dynamic是阻止海龟的一个非常明显的替代方法。您如何知道如何将“Boom”传递给GetMethod()?你必须知道一些事情。
public class Bar<T> : IBar {
public void Boom() {
Console.WriteLine("I am booming");
}
}
interface IBar {
void Boom();
}
...
var genericBar = (IBar)Activator.CreateInstance(specificRepoType);