Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#_Class - Fatal编程技术网

c#如何在另一个类字符串中使用类名

c#如何在另一个类字符串中使用类名,c#,class,C#,Class,给出了以下两种方法定义: 我希望能够使用方法名称作为字符串来调用其中任何一个方法 public int进程(字符串类名,int a,int b) { //className=“SumClass”或className=“MultClass” 返回类名(a,b); } 我可以向您展示一种反射方法,它可以满足您的需要。但我不会,因为几乎总是有更好的方法。你为什么要那样?因为你有不同的加法和乘法方法。一个更好的方法是使用枚举: public enum ProcessType { Multip

给出了以下两种方法定义:

我希望能够使用方法名称作为字符串来调用其中任何一个方法

public int进程(字符串类名,int a,int b)
{
//className=“SumClass”或className=“MultClass”
返回类名(a,b);
}

我可以向您展示一种反射方法,它可以满足您的需要。但我不会,因为几乎总是有更好的方法。你为什么要那样?因为你有不同的加法和乘法方法。一个更好的方法是使用
枚举

public enum ProcessType { 
    Multiplication,
    Addition,
    Division,
    Subtraction
}

public int Process(ProcessType processType, int a, int b)
{
    switch (processType)
    { 
        case ProcessType.Addition:
            return SumClass(a, b);
        case ProcessType.Multiplication:
            return MultClass(a, b);
         // ...
    }
}
所以如果你想求2+3的和:

int result = Process(ProcessType.Addition, 2, 3);  

我可以向您展示一种反射方法,它可以满足您的需求。但我不会,因为几乎总是有更好的方法。你为什么要那样?因为你有不同的加法和乘法方法。一个更好的方法是使用
枚举

public enum ProcessType { 
    Multiplication,
    Addition,
    Division,
    Subtraction
}

public int Process(ProcessType processType, int a, int b)
{
    switch (processType)
    { 
        case ProcessType.Addition:
            return SumClass(a, b);
        case ProcessType.Multiplication:
            return MultClass(a, b);
         // ...
    }
}
所以如果你想求2+3的和:

int result = Process(ProcessType.Addition, 2, 3);  

定义一个类似IOOperation的接口:

public interface IOperation
{
    int DoMe(int a, int b);
}
现在您可以在一个地方处理这个问题,并创建任意数量的实现。e、 g:

public class Addition : IOperation
{
    public int DoMe(int a, int b)
    {
        return a + b;
    }
}

然后只需处理(IOOperation操作,int a,int b)。

定义一个类似IOOperation的接口:

public interface IOperation
{
    int DoMe(int a, int b);
}
现在您可以在一个地方处理这个问题,并创建任意数量的实现。e、 g:

public class Addition : IOperation
{
    public int DoMe(int a, int b)
    {
        return a + b;
    }
}

然后只需处理(IOOperation操作,int a,int b)。

使用字符串字典来委托包含实现或代理到实现:

//Setup
static Dictionary<string,Func<int,int,int>>() lookups = new Dictionary<string,Func<int,int,int>>();

static classname() { //static constructor
    lookups.Add("SumClass", (a,b) => {
        return a + b;
    }); 
    lookups.Add("MultClass", (a,b) => {
        return a * b;
    });
}

//Use
public int Process(string className, int a, int b)
{
  // className="SumClass" or className="MultClass"
  return lookup[className](a,b); //not exactly the same as your request, but close and still a string.
}
//设置
静态字典()查找=新建字典();
静态类名称(){//静态构造函数
添加(“SumClass”,(a,b)=>{
返回a+b;
}); 
lookups.Add(“MultClass”,(a,b)=>{
返回a*b;
});
}
//使用
公共int进程(字符串类名称,int a,int b)
{
//className=“SumClass”或className=“MultClass”
返回lookup[className](a,b);//与您的请求不完全相同,但是close仍然是一个字符串。
}

使用字符串字典来委托包含实现或代理实现:

//Setup
static Dictionary<string,Func<int,int,int>>() lookups = new Dictionary<string,Func<int,int,int>>();

static classname() { //static constructor
    lookups.Add("SumClass", (a,b) => {
        return a + b;
    }); 
    lookups.Add("MultClass", (a,b) => {
        return a * b;
    });
}

//Use
public int Process(string className, int a, int b)
{
  // className="SumClass" or className="MultClass"
  return lookup[className](a,b); //not exactly the same as your request, but close and still a string.
}
//设置
静态字典()查找=新建字典();
静态类名称(){//静态构造函数
添加(“SumClass”,(a,b)=>{
返回a+b;
}); 
lookups.Add(“MultClass”,(a,b)=>{
返回a*b;
});
}
//使用
公共int进程(字符串类名称,int a,int b)
{
//className=“SumClass”或className=“MultClass”
返回lookup[className](a,b);//与您的请求不完全相同,但是close仍然是一个字符串。
}

我更喜欢上面提到的方法,但如果您特别想要基于反射的方法,这里就是

请注意,您将无法获得任何类型安全性,也无法知道您试图调用的方法是否确实存在于对象上,并且它可能在运行时失败

public class Test
{
     public int Process(string className, int a, int b)
     {
      // className="SumClass" or className="MultClass"

      return (int)(typeof (Test).GetMethod(className, BindingFlags.Instance | BindingFlags.Public)
        .Invoke(this, BindingFlags.InvokeMethod, null, new Object[] {a, b}, CultureInfo.CurrentCulture));

    }

    public int SumClass(int a, int b)
    {
      return a + b;
    }

    public int MultClass(int a, int b)
    {
      return a * b;
    }
}

我更喜欢上面提到的方法,但如果您特别想要基于反射的方法,这里就是

请注意,您将无法获得任何类型安全性,也无法知道您试图调用的方法是否确实存在于对象上,并且它可能在运行时失败

public class Test
{
     public int Process(string className, int a, int b)
     {
      // className="SumClass" or className="MultClass"

      return (int)(typeof (Test).GetMethod(className, BindingFlags.Instance | BindingFlags.Public)
        .Invoke(this, BindingFlags.InvokeMethod, null, new Object[] {a, b}, CultureInfo.CurrentCulture));

    }

    public int SumClass(int a, int b)
    {
      return a + b;
    }

    public int MultClass(int a, int b)
    {
      return a * b;
    }
}