Tim*_*Tim 3 javascript reflection log4javascript typescript
我正在尝试在我的打字稿程序中设置日志记录,使用log4javascript.
但是我不知道如何使用反射(而不是手动输入)检索函数名称。
理想情况下,我想模仿我所做的C#:
public class Foo
{
private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(typeof(Foo));
public Foo()
{
}
public FooMethod()
{
try {
logger.Logger.Log(this.GetType(), log4net.Core.Level.Trace, "Entering" + MethodBase.GetCurrentMethod().Name, null);
// code
}
catch (e) {
logger.Logger.Log(this.GetType(), log4net.Core.Level.Debug, ex.Message, null);
}
finally {
logger.Logger.Log(this.GetType(), log4net.Core.Level.Trace, "Exiting" + MethodBase.GetCurrentMethod().Name, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点Typescript?我所能做的就是获取类名。
class Foo {
private static logger: log4javascript.Logger = log4javascript.getLogger(getName(Foo));
constructor() {
}
FooFunction() {
try {
SymDataSource.logger.trace("Entering: " + getName(Foo.prototype.FooFunction));
// code
} catch (e) {
SymDataSource.logger.debug("Exception: " + getName(Foo.prototype.FooFunction), e);
} finally {
SymDataSource.logger.trace("Exiting: " + getName(Foo.prototype.FooFunction));
}
}
}
function getName(obj: any): string {
if (obj.name) {
return obj.name;
}
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec((<any> obj).constructor.toString());
return (results && results.length > 1) ? results[1] : "";
}
Run Code Online (Sandbox Code Playgroud)
类名正确返回,但函数返回为“函数”。
对于成员函数,toString由于原型函数的创建方式,实际上不可能使用简单的解析方法,例如:
Foo.prototype.FooFunction = function () {
return getName(this.FooFunction);
};
Run Code Online (Sandbox Code Playgroud)
这里toString会给你:
function () {
return getName(this.FooFunction);
};
Run Code Online (Sandbox Code Playgroud)
您可以看到function () {.
您可以做的是创建一个内联函数(使用令人敬畏的胖箭头 eg return getName(()=>this.FooFunction);)并解析此本地函数体以查找函数名称。请注意,通过这种方式,它仍然是 TypeSafe,如果您进行重命名重构,则不会出现不同步的魔法字符串。所以完整的实现变成了:
class Foo {
static className = getName(Foo);
constructor() {
}
FooFunction() {
return getName(()=>this.FooFunction);
}
}
function getName(obj: any): string {
if (obj.name) {
return obj.name;
}
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(obj.toString());
var result = results && results.length > 1 && results[1];
// Check to see custom implementation
if(!result){
funcNameRegex = /return _this.(.*);/;
results = (funcNameRegex).exec(obj.toString());
result = results && results.length > 1 && results[1];
}
return result || "";
}
console.log(Foo.className);
var foo = new Foo();
console.log(foo.FooFunction());
Run Code Online (Sandbox Code Playgroud)
这将输出:
Foo
FooFunction
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5908 次 |
| 最近记录: |