을 사용하여 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);
}
}
}
에서 어떻게 할 수 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] : "";
}
클래스 이름은 올바르게 반환되지만 함수는 "Function"으로 반환됩니다.
멤버 함수의 경우 toString
프로토 타입 함수가 생성되는 방식 때문에 실제로 간단한 구문 분석 방법 을 사용할 수 없습니다 . 예 :
Foo.prototype.FooFunction = function () {
return getName(this.FooFunction);
};
여기에 toString
당신에게 줄 것입니다 :
function () {
return getName(this.FooFunction);
};
그리고 사이에 함수 이름이 없음을 알 수 있습니다 function () {
.
당신이 할 수있는 것은 인라인 함수를 만들고 (예를 들어 굉장한 뚱뚱한 화살표를 사용하여 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());
다음을 출력합니다.
Foo
FooFunction
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다