我有一个第三方党派说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(...);
不确定如何?
答案 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的方法。