문제

Javascript <-> C# 브리지를 작성 중인데 다음 문제가 발생했습니다.

JSObject 클래스가 있습니다.

public class JSObject : DynamicObject
{
    public JSEngineAPI wrappedObject { get; set; }

    public JSObject(JSEngineAPI WrappedObject);
    public override bool TryConvert(ConvertBinder binder, out object result);
    public override bool TryGetMember(GetMemberBinder binder, out object result);
    ...
}

다음과 같은 간단한 테스트 사례가 있다고 가정해 보겠습니다.

public class TestClass
{
    public string message = "This is a C# string";
}

public class TestApp
{
    public string testComplexObject(TestClass obj)
    {
        return obj.message;
    }
}

이제 나는 할 수 있고 싶다

JSObject jsObj = ...;
string message = testComplexObject(jsObj);

행위 obj.message 수행해야 한다 TryGetMember() 부르다.효과적으로 jsObj는 TestClass 인스턴스인 척해야 합니다.testComplexObject에 대한 호출은 단지 예일 뿐이며 나중에 임의 인수를 사용하여 임의 함수 호출을 지원할 수 있어야 합니다.

나는 이 작업을 수행하기 위해 다양한 방법을 시도했지만 그 중 아무 것도 작동하지 않았습니다.그래서 이것을 달성하는 좋은 방법이 궁금합니다.

TestClass에서 상속받는 클래스를 런타임에 생성하는 방법에 대해 생각해 보았습니다.이 동적 클래스에는 기본 클래스 펜던트를 오버로드하는 생성된 멤버가 포함됩니다.이러한 각 메소드는 실제 작업을 수행하기 위해 JSObject/JSEngineAPI로 전달됩니다.그런 다음 이 동적 클래스의 인스턴스를 testComplexObject 메서드에 전달할 수 있습니다.

그러나 이것은 다소 복잡하게 들리며 이에 대한 더 쉬운/다른 접근 방식이 있는지 알고 싶습니다.

편집 #1: "DynamicObject" 부분을 빼면 이 질문은 런타임에 T 유형에 대한 프록시를 어떻게 생성할 수 있는지와 비슷할 것 같습니다.

편집 #2: 또한 RealProxy 및 IDynamicMetaObjectProvider를 조사한 결과 이것이 도움이 되는지 궁금합니다.

시간 내 주셔서 감사합니다 -마티아스

도움이 되었습니까?

해결책

메소드의 서명을 변경할 수 없으므로 동적 객체에 대해서는 프록시를 만들 수 있습니다.이는 객체가 포드 인 경우에만 효과적이거나 무시할 수있는 가상 메소드에 충전됩니다.그렇지 않으면 귀하의 메소드가 사용되지 않아도됩니다.원하는 유형을 구현하지만 모든 액세스를 실제 객체에 전달합니다.이 사용을 사용하면 동적 객체에 변환 방법을 추가 할 경우 쉽게 사용할 수 있습니다.이와 같은 것 :

public class JSObject : DynamicObject
{
    class TestClassProxy : TestClass
    {
        private dynamic wrapper;
        public TestClassProxy(dynamic obj)
        {
            wrapper = obj;
            // assign copies of the fields
            message = obj.message;
        }
        // override all required methods and properties
        public override void SampleMethod()
        {
            wrapper.SampleMethod();
        }
        public override int SomeValue
        {
            get { return wrapper.SomeValue; }
            set { wrapper.SomeValue = value; }
        }
        // etc...
    }

    public override bool TryConvert(ConvertBinder binder, out object result)
    {
        if (binder.Type == typeof(TestClass))
        {
            result = new TestClassProxy(this);
            return true;
        }
        // your other conversions
        return base.TryConvert(binder, out result);
    }
    // etc...
}
.

개체로 더 많은 것을 해야하는 경우 방법의 서명을 변경하는 것 이외에 다른 방법으로 어떻게 얻을 수 있는지 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top