C# 将类作为参数传递给方法,并在其中调用静态方法
本文关键字:在其中 调用 静态方法 方法 参数传递 | 更新日期: 2023-09-27 17:55:57
我是C#的新手,正在寻找执行以下实现的最佳方法。
我的项目有几个模型类(如 25 个),每个类都有一个名为"process()"的静态方法,它只需要一点时间来完成它的任务。
我需要在每个类中一个接一个地调用所有这些方法,并添加一些日志(将方法执行的状态写入文件)来跟踪执行情况。
我可以简单地执行以下操作,但肯定应该有更好的专业方法来做到这一点
Log.WriteLog(DateTime.Now + " Class A Process Started");
ClassA.Process()
Log.WriteLog(DateTime.Now + " Class A Process Finished");
Log.WriteLog(DateTime.Now + " Class B Process Started");
ClassB.Process()
Log.WriteLog(DateTime.Now + " Class B Process Finished");
............ continue 25 classes
我正在尝试做的是编写一个方法,然后在其中添加日志和重复性工作。
private void CommonMethod(Class)
{
Check what class
Add Process started Log
Call Process method
Add proicess finished Log
}
您可以创建接受委托并执行日志记录的函数,如下所示:
public void ProcessAndLog(Action action, String processName)
{
Log.WriteLog(DateTime.Now + $" Class {processName} Process Started");
action();
Log.WriteLog(DateTime.Now + $" Class {processName} Process Finished");
}
并这样称呼它:
ProcessAndLog(ClassA.Process, "A"); //"A" could be part of ClassA - e.g. ClassA.Name;
ProcessAndLog(ClassB.Process, "B");
//etc
只要每个Process
方法都没有参数并且重新调整无效 - Action
委托的签名,这将起作用。
如果它有参数,你可以这样调用它:
ProcessAndLog(() => ClassC.Process("value"), "C");
如果需要返回值,请考虑使用 Func<T>
而不是 Action
。
你可以这样做:
private void CommonMethod<T>()
{
//Add Process started Log
//Call Process method
typeof(T).GetMethod("process")?.Invoke(null, null); // not target needed
//Add proicess finished Log
}
用法:
CommonMethod<ClassA>();
CommonMethod<ClassB>();
C# 中不存在静态接口。引用类的静态成员的唯一方法是通过其类名和成员名。
另一种方法是使用反射。通过其字符串名称获取静态方法并调用它。喜欢这个:
static void CommonMethod(Type type)
{
MethodInfo methodInfo = type.GetMethod("TheStaticMethodName");
if (methodInfo != null)
{
methodInfo.Invoke(null, new object[0]);
}
}
//Invoke it like this
CommonMethod(typeof(MyStaticType));
Invoke
的第一个参数是目标。对于实例方法,您将传递要调用的类实例,但对于静态成员,只需null
.
第二个参数是参数。如果没有参数,您可以放置一个空数组。
此外,对于泛型类型,您可以使用相同的方法,如下所示:
static void CommonMethod<T>()
{
MethodInfo methodInfo = typeof(T).GetMethod("TheStaticMethodName");
if (methodInfo != null)
{
methodInfo.Invoke(null, new object[0]);
}
}
请注意,泛型并不总是最好的,因为它们在编译时会生成很多东西。
这是另一个建议:
class Program
{
static void Main(string[] args)
{
var x = new Calculate { a = 1, b = 2 };
var y = new Calculate { a = 10, b = 20 };
var z = new Calculate { a = 100, b = 200 };
var calculations = new List<Calculate>{
new Calculate() { a = 1, b = 2 },
new Calculate() { a = 10, b = 20 },
new Calculate() { a = 100, b = 200 }
};
calculations.ForEach(c =>
{
c.Process();
});
}
}
class Calculate
{
public int a { get; set; }
public int b { get; set; }
public void Process()
{
Console.WriteLine(a + b);
}
}