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