我目前正在用C#编写程序,这个程序有一个名为Classes的文件夹,许多名为a-f的子文件夹,以及名为aa-cc的文件夹中的实际cs文件。
a-f是命名空间 aa-cc是课程。
所以,如果我想从Classes \ b \ bb.cs中调用一个方法,我每次都要输入
b.bb,methodName();
它还将生成两个字符串,用于决定我们将要执行的内容。
String myType = "b";
String myClass = "bb";
String toReturn = "";
myType和myClass有很多种组合,所以我必须编写很多if循环
if (myType.equals("b") && myClass.equals("bb") return toReturn = b.bb.myMethod();
if (myType.equals("b") && myClass.equals("aa") return toReturn = b.aa.myMethod();
这是非常多的打字,我觉得有一种更简单的方法可以做到这一点,因为我已经知道了什么知道我想要访问什么命名空间以及我想要调用什么方法。
我有什么方法可以做像
这样的事情myType.myClass.myMethod()
其中myType是命名空间,myClass是我想要调用的类。这样可以避免输入任何可能的组合。
答案 0 :(得分:2)
使用代理改进样本。家庭作业:在GetDelegate
方法中为商店代表添加哈希值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using TestConsole.Data;
namespace NamespaceA
{
public class ClassAB
{
public void MyMethod()
{
Console.WriteLine("You invoke NamespaceA.ClassAB.MyMethod");
}
public static void MyStaticMethod()
{
Console.WriteLine("You invoke NamespaceA.ClassAB.MyStaticMethod");
}
}
}
namespace TestConsole
{
public delegate void DoSomethingUseful(); // same as Action delegate
class Program
{
/// <summary>
/// create delegate
/// </summary>
/// <param name="namespace"> namespace name </param>
/// <param name="class"> class name </param>
/// <param name="method"> method name </param>
/// <returns></returns>
public static DoSomethingUseful GetDelegate(string @namespace, string @class, string method)
{
// common argument checks
if (@namespace == null) throw new ArgumentNullException("namespace");
if (@class == null) throw new ArgumentNullException("class");
if (method == null) throw new ArgumentNullException("method");
// find class
Type type = Type.GetType(@namespace + "." + @class);
if (type == null) throw new Exception("type not found");
// find method
MethodInfo methodInfo = type.GetMethod(method);
if (methodInfo == null) throw new Exception("method not found");
// create the delegate
return (DoSomethingUseful)Delegate.CreateDelegate(typeof(DoSomethingUseful), methodInfo.IsStatic ? null : Activator.CreateInstance(type), methodInfo);
}
static void Main(string[] args)
{
// creating delegates
DoSomethingUseful methodA = GetDelegate("NamespaceA", "ClassAB", "MyMethod");
DoSomethingUseful methodB = GetDelegate("NamespaceA", "ClassAB", "MyStaticMethod");
// usage
methodA();
methodB();
Console.WriteLine();
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
}
答案 1 :(得分:1)
下面的完整代码示例。
请记住,如果您的类方法不是静态的(object instance = Activator.CreateInstance(type);
);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TestConsole.Data;
namespace NamespaceA
{
public class ClassAB
{
public void MyMethod()
{
Console.WriteLine("You invoke NamespaceA.ClassAB.MyMethod");
}
public static void MyStaticMethod()
{
Console.WriteLine("You invoke NamespaceA.ClassAB.MyStaticMethod");
}
}
}
namespace TestConsole
{
class Program
{
static void Main(string[] args)
{
Type type = Type.GetType("NamespaceA.ClassAB");
object instance = Activator.CreateInstance(type);
type.GetMethod("MyMethod").Invoke(instance, null); // instance is required
type.GetMethod("MyStaticMethod").Invoke(null, null); // instance is not required
Console.WriteLine();
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
}
答案 2 :(得分:0)
使用static
。
public static HelperClass
{
public static void HelperMethod() {
// ...
}
}
用法(在添加对类库的引用之后)。
HelperClass.HelperMethod();