Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MakeGenericType()实际上生成了一个对象,我不能使用类型';s方法_C#_Generics - Fatal编程技术网

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);