我是C#的新手,并且正在寻找执行以下实施的最佳方式。
我的项目有几个Model类(比如25),每个类都有一个名为" process()"的静态方法,只需要一点时间来完成它的任务。 / p>
我需要一个接一个地在每个类中调用所有这些方法,并添加一些日志(将方法执行的写入状态写入文件)以跟踪执行。
我可以简单地执行以下操作,但肯定应该有更好的专业方法来执行此操作
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
}
答案 0 :(得分:5)
您可以创建接受委托并执行日志记录的函数,如下所示:
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
。
答案 1 :(得分:1)
你可以这样做:
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>();
答案 2 :(得分:1)
静态接口不存在于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]);
}
}
请注意,泛型并不总是最好的,因为它们在编译时会生成很多东西。
答案 3 :(得分: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);
}
}