μλ
,
리νλ μ
μ¬μ©μ μ ννλ λ°©λ²μ΄ μμ΅λκΉ?
μ¬λλ€μ΄ .NET μ νμμ .GetTypeμ μ¬μ©νλ κ²μ μνμ§ μμ΅λλ€.
νμ¬ μ½λμ "GetType"μ΄ ν¬ν¨λμ΄ μλμ§ νμΈνκ³ μμ§λ§ 100% μμ νμ§ μμ μ μμ΅λλ€.
λ©μλ νΈμΆμ μλμΌλ‘ ν΄κ²°νλ λ° μ¬μ©ν μ μλ μ΄λ²€νΈκ° μμ΅λκΉ? μλ ν΄κ²°λλ λμ ?
μλλ©΄ 리νλ μ μ¬μ©μ λ°©μ§νλ μ€μ μ΄ μμ΅λκΉ?
.NET ν΄λμ€μ μ¬μ©μ μ 체μ μΌλ‘ λ°©μ§νκ±°λ νΉμ λ€μμ€νμ΄μ€λ₯Ό λ±λ‘ν μ μμ΅λλ€. μΆ©λΆνμ§ μμ΅λκΉ?
λ΄κ° μνλ μμ±κ³Ό λ©μλλ§ λ ΈμΆνλ λνΌ κ°μ²΄λ₯Ό .netμμ λ§λ€μκΈ° λλ¬Έμ jsμμ λ΄ κ°μ²΄λ₯Ό λ ΈμΆνκ³ μΆμ΅λλ€.
κ·Έλ¬λ κ·Έλ€μ μ¬μ ν ββ.GetTypeμ κ°μ§κ³ μμ΅λλ€. μ΄κ²μ μ€μ κ°μ²΄μ μ κ·Όνλ λ° μ¬μ©λ μ μκ³ ν¨μ¬ λ λ§μ΄ κ°λ₯νκΈ° λλ¬Έμ μ μκ² λ³΄μ λ¬Έμ μ λλ€.
λ§μ΅λλ€. .NETμ΄ μ΄λ₯Ό λ°©μ§νκΈ° μν΄ ν μ μλ μΌμ μμ΅λλ€. λνΌ(AutoMapper μ°Έμ‘°) λμ μ κ°μ²΄λ₯Ό λ§λ€κ³ μ λ¬ν μ μμ΅λλ€. DTOμ²λΌ.
.netμ "κ°μ²΄"μ μ§μ μκΈ° λλ¬Έμ λͺ¨λ κ°μ²΄μλ GetType()μ΄ μμ΅λλ€.
OnMethodCall λλ OnResolveMethod κ°μ νν¬κ° μμ΅λκΉ?
κ·Έλμ μλμΌλ‘ λ°©λ²μ ν΄κ²°ν μ μμ΅λκΉ, μλλ©΄ μ‘μΈμ€λ₯Ό κ±°λΆν μ μμ΅λκΉ?
λμ κ°μ²΄λ₯Ό μ¬μ©νκ³ λ©μλ ν΄κ²°μ μ¬μ μν μ μμ΅λλ€.
2016λ
3μ 1μΌ νμμΌ μ€ν 1μ 58λΆ, asdfgasdfsafgsdfa [email protected]
μΌλ€:
λͺ¨λ κ°μ²΄λ GetType()μ κ°μ§λλ€.
.κ·Έλ¬ΌOnMethodCall λλ OnResolveMethod κ°μ νν¬κ° μμ΅λκΉ?
κ·Έλμ μλμΌλ‘ λ°©λ²μ ν΄κ²°ν μ μμ΅λκΉ, μλλ©΄ μ‘μΈμ€λ₯Ό κ±°λΆν μ μμ΅λκΉ?β
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ±°λ GitHubμμ νμΈνμΈμ.
https://github.com/sebastienros/jint/issues/275#issuecomment -190852140.
@doronguttman λ§μ΅λλ€. λνΌκ° μ΄λ₯Ό λ°©μ§ν μ μμ΅λλ€.
μκ² μ΅λλ€. μ 보 κ°μ¬ν©λλ€. κ·Έλ κ² νκ² μ΅λλ€.
μλ
,
μ΄ λ¬Έμ λ₯Ό μ μΆν΄ μ£Όμ
μ κ°μ¬ν©λλ€. JS μμ§μ .Net κ°μ²΄λ₯Ό μ λ¬νλ©΄ JSκ° .GetType()
λ₯Ό νΈμΆν μ μμ κ±°λΌκ³ μκ°νμ§ λͺ»νμ΅λλ€. μ¬μ©μ μ μ JS μ½λκ° μ ν리μΌμ΄μ
μ λ―Όκ°ν μ 보λ₯Ό μ μ₯νλ λ€μν ν΄λμ€μ νλλ₯Ό κ²μν μ μκΈ° λλ¬Έμ μ΄κ²μ 보μ λ¬Έμ μ΄κΈ°λ ν©λλ€.
μλ λ©μλλ₯Ό μ¨κΈ°κΈ° μν΄ "GetType" μ λ©μλλ₯Ό μ μΈνκΈ° μν΄ λ΄κ° Jintμ μ λ¬ν κ°μ²΄μ λν΄ μΆ©λΆν κΉμ? μ΄μ κ°μ΄:
C#
public class Api {
public new void GetType() {
// Don't allow JS code to get the type
}
}
μ΄κ²μ μλνμ λ μλνλ κ² κ°μμ΅λλ€(Javascriptμμλ .GetType()μ νΈμΆνμ¬ μ μλμ§ μμ). κ·Έλ¬λ μ΄κ²μ μ°ννλ λ°©λ²μ΄ μλμ§ λͺ¨λ₯΄κ² μ΅λλ€(.Netμμλ ((object)api).GetType()
λ₯Ό ν μ μμ΅λλ€. μ¬μ ν μ νμ μ»μ΅λλ€).
μ΄κ²μΌλ‘ μΆ©λΆνλ€λ©΄ (λμ ) λνΌ κ°μ²΄λ₯Ό μ¬μ©νλ λμ μ΄ μ루μ
μ μ νΈν©λλ€. λλ μλ‘μ΄ GetType() λ©μλλ₯Ό μ μΈνκΈ° μν΄ Jintμ μ λ¬ν μ μλ λͺ¨λ ν΄λμ€λ₯Ό κ°μ§ κ²μ
λλ€.
μ΄κ²μ Array κ°μ²΄μλ νμν©λκΉ? μ΄κ²μ ν μ€νΈνμ λ .Net κ°μ²΄κ° .Net Arrayλ₯Ό λ°νν λ Jintλ λ€μ΄ν°λΈ μλ°μ€ν¬λ¦½νΈ λ°°μ΄μ μμ±νλ―λ‘ GetType()μ΄ κ°λ₯νμ§ μμ κ² κ°μ΅λλ€.
Javascript μ½λκ° μ λ¬λ .Net κ°μ²΄μ λν΄ .GetType()μ νΈμΆνμ¬ λ€λ₯Έ κ°μ²΄μ μ‘μΈμ€ν μ μλ€λ κ²μ λͺ¨λ μ¬λμ΄ κΉ¨λ«μ§ λͺ»ν κ²μ΄λΌκ³ μκ°νκΈ° λλ¬Έμ .Net κ°μ²΄μμ μ΄λ¦μ΄ "GetType"μΈ νΈμΆ λ©μλλ₯Ό νμ©νμ§ μλλ‘ Jintλ₯Ό μμ ν μ μλμ§ κΆκΈν©λλ€. ν΄λμ€μ νλ.
μ΄λ κ² νλ©΄ μ΄λ―Έ μ‘΄μ¬νλ .Net μ νμ μ λ¬ν μλ μμ΅λλ€(κ·Έλ μ§ μμΌλ©΄ λ€λ₯Έ κ°μ²΄λ₯Ό λ°ννλ λ©μλμ λν μ λνΌλ₯Ό μ°¨λ‘λ‘ μμ±νλ λμ λνΌλ₯Ό μμ±ν΄μΌ ν¨).
κ°μ¬ ν΄μ!
@T18970237136
λλ κ·Έκ²μ΄ μ΄λ»κ²λ νΌν μ μλ€κ³ νμ νλ€. κ·Έλ¦¬κ³ κ·Έλ μ§ μλλΌλ "new object()"λ₯Ό μΈμ€ν΄μ€νν λ€μ GetTypeμ μ¬μ©νλ λ°©λ²μ΄ μμ μ μμ΅λλ€.
μ΄μ λν μ΅μμ μ루μ μ μΌμ’ μ νΈμΆ μ΄λ²€νΈ λλ ν λΉν μ μλ λ λμ μΌλΆ ν΄λμ€λ₯Ό κ°λ κ²μ λλ€.
μλ₯Ό λ€μ΄:
class InvokeFilter { virtual MethodInfo ResolveMethod(... ) { /_jintκ° κΈ°λ³Έμ μΌλ‘ μννλ λͺ¨λ μμ μ μ΄λ―Έ_/ } }
κ·Έλ° λ€μ μμ μ νΈμΆ νν°λ₯Ό ꡬννκ³ νν°λ§νκ³ μΆμ§ μμ νλͺ©μ base.ResolveMethod(...)μ μ λ¬ν μ μμ΅λλ€.
λλ μ΄κ²μ΄ μ ν ꡬννκΈ° μ΄λ ΅λ€κ³ μκ°νμ§ μμ΅λλ€. μλ§λ λμ€μ PRμ ν κ²μ
λλ€.
νμ§λ§ @sebastienros κ° λ€μΌμ§ νμ ν μ μμ΅λλ€ :S
μ λ μ΄κ²μ μ¬μ©μ μ μ μμ±μΈ JintInteropAttributeλ‘ κ΅¬ννλ €κ³ ν©λλ€.
ObjectWrapper ν΄λμ€μ GetOwnProperty λ©μλλ₯Ό μ λ°μ΄νΈνμ¬ μ΄ νΉμ±μ μ‘΄μ¬ μ¬λΆμ λ°λΌ λ°μ¬λ₯Ό νν°λ§ν μ μμ΅λλ€.
μ΄κ²μ Jintμ μ λ¬λ .NET κ°μ²΄λ₯Ό μ κ°μΌ ν©λλ€(κΈ°λ³Έμ μΌλ‘ GetType, ToString λ° GetHashCode λ±κ³Ό κ°μ λ©μλλ₯Ό μ¨κΉ). κ·Έλ° λ€μ μμ±μΌλ‘ μ₯μνμ¬ ν΄λμ€ λ©€λ²μ μ‘μΈμ€ν μ μμ΅λλ€.
[JintInterop]
public void CallMe()
{
}
(NB .NET ν΄λμ€ λ° λ€μμ€νμ΄μ€μ λν μ§μ μ‘μΈμ€λ₯Ό νμ©ν νμκ° μμ΅λλ€)
μ¬μ©μ μ§μ μμ±μ λ§λλ λμ λ©€λ²(μμ±, νλ, λ©μλ λ±)μ λν 리νλ μ μ΄ νΈμΆλ λλ§λ€ νΈμΆλλ μ΅μ μμ μ΄λ²€νΈλ₯Ό λ§λ€κ³ μ΄λ₯Ό νμ©/λΉνμ©νλ €λ©΄ true/falseλ₯Ό λ°νν΄μΌ ν©λλ€. κ·Έλ° λ€μ μ¬μ©μ μ μ μμ±μ μ¬μ©νκ±°λ μ΄λ¦μ νμΈνλ κ²κ³Ό κ°μ΄ μ½λμμ μ체 λ Όλ¦¬λ₯Ό λ§λ€μ΄ μ°¨λ¨ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ μΌλ°μ μΈ κ²½μ°μ μ±λ₯μλ μν₯μ λ―ΈμΉμ§ μμ΅λλ€.
μ’μ μκ°μ΄μΌ. λν νλ‘μ νΈμμ Jintμ λν΄ μ νμκ° μμ μλ μλ Jintμ λν μ’ μ κ°λ₯μ±μ μ€μ λλ€.
μ΄ λ¬Έμ #523μ λκΈ° μν΄ ν 리νμ€νΈλ₯Ό λ°ννμ΅λλ€.
JsValue.FromObject
λ©μλκ° Syste.Type
λ₯Ό TypeReference
λ‘ λ³ννκΈ° λλ¬Έμ μ΄κ²μ λ¬Έμ κ° λμ§ μμ΅λλ€.
λ°λΌμ μΌλ° 리νλ μ μ μ¬μ©ν μ μμΌλ©° μ΄λ―Έ μλ €μ§ μ νλ§ μ¬μ©ν μ μμ΅λλ€.
IObjectConverter
λ₯Ό μΆκ°νμ¬ νΉμ μ νμ νμ©νμ§ μμ μλ μμ΅λλ€.
ObjectWrapper.csμμ DeclaredOnlyμ λν BindingFlagλ₯Ό μΆκ°νλλ‘ 84νμ λ³κ²½νμΌλ©° "GetHashCode" λ° "GetType"μ λν νΈμΆμ μ°¨λ¨νλ κ²μΌλ‘ 보μ λλ€.
// if no properties were found then look for a method (edited)
var methods = type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)
.Where(m => EqualsIgnoreCasing(m.Name, propertyName))
.ToArray();
κΈμ, λλ λ°λλ‘ λ¬»μ΅λλ€. GetTypeμ μ΄λ»κ² νμ±νν©λκΉ? λλ₯Ό μν΄ νμ nullμ λ°ννκΈ° λλ¬Έμ λλ€. GetMethod κΈ°λ₯μ΄ νμν©λλ€.
κ°μ₯ μ μ©ν λκΈ
ObjectWrapper.csμμ DeclaredOnlyμ λν BindingFlagλ₯Ό μΆκ°νλλ‘ 84νμ λ³κ²½νμΌλ©° "GetHashCode" λ° "GetType"μ λν νΈμΆμ μ°¨λ¨νλ κ²μΌλ‘ 보μ λλ€.