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
}

C# 将类作为参数传递给方法,并在其中调用静态方法

您可以创建接受委托并执行日志记录的函数,如下所示:

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