C# 双重编码和淘汰赛

C# 双重编码和淘汰赛,c#,knockout.js,duocode,C#,Knockout.js,Duocode,我将其视为TypeScript的替代方案,因为它使用C,这意味着我的开发人员可以将他们已有的知识用于C,但我们也可以在客户端和服务器上重用验证逻辑 目前还没有敲除绑定,所以我创建了自己的,非常简单 namespace Knockout { [Js(Name = "ko", Extern = true)] public static class Global { [Js(Name = "observable", OmitGenericArgs = true)

我将其视为TypeScript的替代方案,因为它使用C,这意味着我的开发人员可以将他们已有的知识用于C,但我们也可以在客户端和服务器上重用验证逻辑

目前还没有敲除绑定,所以我创建了自己的,非常简单

namespace Knockout
{
    [Js(Name = "ko", Extern = true)]
    public static class Global
    {
        [Js(Name = "observable", OmitGenericArgs = true)]
        public static extern Observable<T> Observable<T>();

        [Js(Name = "observable", OmitGenericArgs = true)]
        public static extern Observable<T> Observable<T>(T value);

        [Js(Name = "computed", OmitGenericArgs = true)]
        public static extern Observable<T> Computed<T>(Func<T> computed);

        [Js(Name = "applyBindings")]
        public static extern void ApplyBindings(object viewModel);

        [Js(Name = "unwrap", OmitGenericArgs = true)]
        public static extern T Unwrap<T>(Observable<T> observable);

    }

    [Js(Name = "ko.observable", Extern = true)]
    public class Observable<T>
    {
        //TODO: Add more methods like subscribe, extend etc
    }
}
其中有许多缺点是公认的解决方案

有什么想法吗

edit:Extension方法使它变得更好一些,但缺点是您现在需要包含使用Knockout绑定类库编译的javascript

public static class ObservableExtensions
{
    public static void SetValue<T>(this Observable<T> observable, T value)
    {
        Js.referenceAs<Action<T>>("observable")(value);
    }
}
而不仅仅是

this.get_Bar()("New value");
我还有一个问题,我也在研究击倒可观测阵列,我有这个

public static class ObservableExtensions
{
    public static void Set<T>(this Observable<T> observable, T value)
    {
        observable.As<Action<T>>()(value);
    }

    public static T Get<T>(this Observable<T> observable)
    {
        return observable.As<Func<T>>()();
    }
}
[Js(Name = "ko.observableArray", Extern = true)]
public class ObservableArray<T> : Observable<JsArray<T>>
{
    [Js(Name = "push", OmitGenericArgs = true)]
    public extern void Push(T value);
}

这将失败,因为敲除可观察数组需要一个正常的Javascript数组。

我建议如下:

  • 您可以像这样使用扩展方法:
    Bar.As()(“新值”)
  • 另一个选项是使可观察继承JsFunction,然后您可以像这样调用invoke:
    Bar.invoke(“新值”)
  • 另一种选择是在扩展方法中使用相同的方法,类似于您所建议的方法。定义如下方法:

    public static void Set<T>(this Observable<T> o, T value)
    {
      o.As<Action<T>>()(value);
    }
    
    [Js(Name="")]
    public void SetValue(T value)
    
    [Js(Name = "observableArray", OmitGenericArgs = true)]
    public static extern ObservableArray<T> ObservableArray<T>(object[] values);
    
    关于您的第二个问题:查看mscorlib.js中的代码,
    $d.array
    创建普通数组(只是为运行时类型信息添加了一些额外的属性)。这里的问题是,它为Int32之类的类型创建类型化数组。所以我想你可以创建一个对象数组而不是T,它应该可以工作,如下所示:

    public static void Set<T>(this Observable<T> o, T value)
    {
      o.As<Action<T>>()(value);
    }
    
    [Js(Name="")]
    public void SetValue(T value)
    
    [Js(Name = "observableArray", OmitGenericArgs = true)]
    public static extern ObservableArray<T> ObservableArray<T>(object[] values);
    
    [Js(Name=“observearray”,省略genericargs=true)]
    公共静态外部ObserverRay ObserverRay(对象[]值);
    
    你对数组的内容没有任何意见?我想这应该会有帮助,请告诉我是否有,我回家后会试试,但是哎哟,删除类型安全性感觉像是一个很大的损失:/我同意,这不是最佳的。我开了一张罚单,谢谢你的帮助
    [Js(Name="")]
    public void SetValue(T value)
    
    [Js(Name = "observableArray", OmitGenericArgs = true)]
    public static extern ObservableArray<T> ObservableArray<T>(object[] values);