覆盖第三方中的方法

时间:2014-04-22 23:26:20

标签: c#

我有一个第三方党派说Log。它包含方法

public void Write(string s, params object[] args)
{
            Monitor.Enter(this);
            try
            {
                            string logEntry = string.Format(s, args);
                            this.Write(logEntry);
            }
            finally
            {
                            Monitor.Exit(this);
            }
}

public void Write(string LogEntry)
{
    this.Write(0, LogEntry);
}

我在自己的班级中定义了一个属性outLog

public static Log OutLog  {get;set;}

我想使用功能" CallerMemberNameAttribute"在.net 4.5中,并覆盖Write方法,如:

public void Write(string s,
    [CallerMemberName] string memberName = "",
    [CallerFilePath] string sourceFilePath = "",
    [CallerLineNumber] int sourceLineNumber = 0)
    {
        Monitor.Enter(this);
        try
        {
            string logEntry = string.Format(s, memberName, sourceFilePath, sourceLineNumber);
            this.Write(logEntry);
        }
        finally
        {
            Monitor.Exit(this);
        }
    }

所以我可以在课堂上给它打电话:

outLog.Write(...);

不确定如何?

2 个答案:

答案 0 :(得分:4)

您无法覆盖它,但您可以创建一个扩展方法(由第一个参数上的this关键字表示),它将执行您想要的操作。类似的东西:

public static class LogExtensions
{
    public static void WriteWithCallerInfo(
        this Log log,
        string s,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
    {
        Monitor.Enter(log);
        try
        {
            string logEntry = string.Format(s, memberName, sourceFilePath, sourceLineNumber);
            log.Write(logEntry);
        }
        finally
        {
            Monitor.Exit(log);
        }
    }
}

有了这个,你可以写:

OutLog.WriteWithCallerInfo("whatever");

扩展方法不能只调用Write,因为普通方法优先于扩展方法。

请注意,我也不了解锁定的原因,我认为没有必要,假设重载Write(int, string)是线程安全的。

答案 1 :(得分:-1)

您无法覆盖非虚拟/抽象成员。

您可以hide但只有在您将实例用作类的实例时才会有效。如果你将它用作基类的一个实例,它将调用base classe的方法。