C#将Class作为方法的参数并在那里调用静态方法

时间:2016-07-08 14:27:23

标签: c# .net

我是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
}

4 个答案:

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