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# 根据参数返回类型的C函数_C#_Reflection - Fatal编程技术网

C# 根据参数返回类型的C函数

C# 根据参数返回类型的C函数,c#,reflection,C#,Reflection,我想创建一个根据参数返回新对象的函数,例如: 基类: class BaseClass { public int x; } 第一类: class TestClassOne: BaseClass { public TestClassOne() { this.x = 1; } } 第二类: class TestClassTwo: BaseClass { public TestClassOne() {

我想创建一个根据参数返回新对象的函数,例如:

基类:

class BaseClass
{
    public int x;
}
第一类:

class TestClassOne: BaseClass
{        
    public TestClassOne()
    {
        this.x = 1;
    }   
}
第二类:

class TestClassTwo: BaseClass
{
    public TestClassOne()
    {
        this.x = 2;
    }   
}
主要内容:

我写的代码工作得很好,问题是什么时候我会有很多派生类,比如TestClassThree,TestClassThree。。。一千美元。 如果没有if-else或switch-case等,如何生成返回正确构造函数的函数? 我认为反射是一个很好的选择,但我不确定如何使用它。
谢谢

如果你能使用一个通用的方法就最好了,就像勒内的回答一样,但是你使用的是字符串,所以看起来不是这样

有两个步骤:

得到正确的类型; 创建一个实例。 这是所需的最少代码:

Type t = Assembly.GetExecutingAssembly().GetType("SO.BaseClass");

object o = Activator.CreateInstance(t);

正如您所看到的,您需要知道类型的程序集和名称空间,否则您将不得不对其中任何一个进行模糊匹配。

我要提醒您的实现。你试图做的事情叫做工厂。考虑到您正在为基类添加依赖项这一事实,您将被限制为仅允许具有该基类的构造函数。如果您曾经需要某些类具有不同的基类,但通过相同的方法提供,那么您将需要共享一个接口。正如其他人所建议的,您可以使用泛型。下面是一个没有泛型的示例:

public static IMyInterface GetMatchingClass(string className)
    {
        Type t = Type.GetType(className);
        return (IMyInterface)Activator.CreateInstance(t);
    }

只要返回的类实现了给定的接口,一切都很顺利。

您使用字符串来标识所需的类有什么特殊原因吗?不,我只想返回一个派生类,字符串标识是我想到的最好的方法。我认为这比我的答案更有用。我不太确定OP到底想要实现什么。在我的回答中,最后一行可以是BaseClass bc=newtestclassone;,所以我假设OP的类型名是字符串,我认为这很好,但是当我在函数中这样做时,我遗漏了一些东西:type t=Assembly.getExecutionGassembly.GetTypenamespace.TestClassOne;重新运行BaseClassActivator.CreateInstancet;-打印x时,我得到的是0而不是1,这不是由我提供的代码引起的。请检查调试器。是的,可能您在多个位置上有x变量,等等。不是,但到目前为止,我是唯一一个将OP指向工厂模式正确方向的人。我还指出了其他人建议的泛型。我的第一句话说我要提出一个警告。注释不是像我那样提供代码示例的合适位置。区别在于界面的使用。你真的应该在投票前仔细阅读。仅仅回答一个问题并不总是能给你最好的帮助。根据你的批评更新。这已在工作组件中进行了测试。
public static IMyInterface GetMatchingClass(string className)
    {
        Type t = Type.GetType(className);
        return (IMyInterface)Activator.CreateInstance(t);
    }