【问题标题】:automatically generate javascript object model from c# object从 c# 对象自动生成 javascript 对象模型
【发布时间】:2011-11-06 16:57:03
【问题描述】:

寻找现有的、经过验证的解决方案,以快速生成代表现有 c# 对象的客户端 javascript 对象模型。我想那里有一个 T4 模板或其他一些方法,但我缺乏找到它的术语。我不是在谈论序列化以获取现有 c# 对象实例的 JSON 表示或与反序列化有关的任何事情。我只是想为 20 多个 c# 对象生成 javascript 对象模型,并且我希望能够在 c# 代码更改时立即重新生成它们。

我正在寻找的过度简化示例:

C#代码:

[Serializable()] 
public class Cat 
{ 
    public string Name { get; set; }
    public string Breed { get; set; }
} 

要生成的Javascript对象模型:

function Cat() 
{ 
    this.Name = ""; 
    this.Breed = ""; 
} 

@巴斯兹

JSON 是一种基于文本的数据交换标准,这不是我想要的。我需要生成一个包含 20 多个对象的客户端 API,我可以将它们放入一个 javascript 文件中,并将该脚本链接到我的各种网页。

JavaScriptSerializer 可以从 c# 对象中吐出如下字符串:

{ "Name": "Hayden", "Breed": "Rabbit” } 

但这不是一回事:

function Cat()  
{  
    this.Name = "";  
    this.Breed = "";  
}  
  1. JSON 字符串不是命名函数。
  2. 所有元素都被引用并采用 JSON 格式,这需要手动解析字符串才能将其转换为我需要的格式。
  3. 由于#1,您不能像下面这样新建 Cat 实例

var myCat = new Cat();

cmets 并不多,所以我猜每个人都手动或根本不这样做。着眼于创建我自己的 T4 模板来解析 c# 文件并生成我的客户端 API。

【问题讨论】:

  • 有趣的想法,如果你解释你试图通过这种方法完成什么,它可能会帮助人们试图提供答案。例如,使用什么/如何使用这些对象。
  • 嗨,我在考虑写一个类似的问题时发现了你的问题,我想知道我们是否可以尝试使它更通用和更令人满意。两个都。这就是我要的。我有一个使用 Entity Framework 和 MVC4 完成的 REST API,所有这些都带有很好的自动测试。现在,我想创建一个 javascript 库,ly 客户端将使用它来调用这些服务。我会喜欢不必直接编写 javascript,而是从 API 和对象模型自动生成。当然,我知道这可以通过反思来完成,这就是我现在可能要走的方向。但是,找到这样做会更好

标签: javascript object model


【解决方案1】:

经过无数次搜索后,我找不到任何与我正在寻找的东西相近的东西。显然,过去几年每个人都被 JSON 流行语所吸引,没有人会自动生成客户端对象模型。我查看了 Codesmith 和 T4 模板。也没有任何用于解析代码文件的内置机制。两者都需要您进行反思以获取属性及其类型,这 100% 落在开发人员的肩上。一旦您跳过编写所有反射代码的障碍,这引出了一个问题,Codesmith 或 T4 模板给您带来什么好处?完全没有。你介意将你的反射代码放在一个可重用的类库中并从控制台应用程序中调用它,这正是我所做的。

【讨论】:

    【解决方案2】:

    这是一个较老的问题,但您可以尝试sharp2Js。它是一个旨在反映您的类并使用几个实用函数生成 javascript 对象的库。

    针对您提供的示例运行它(并在T4 模板或其他方式中输出它生成的字符串):

    string modelOutput = Castle.Sharp2Js.JsGenerator.
              GenerateJsModelFromTypeWithDescendants(typeof(Cat), true, "example");
    

    生产:

    example = {};
    
    example.Cat = function (cons, overrideObj) {
        if (!overrideObj) { overrideObj = { }; }
        if (!cons) { cons = { }; }
        var i, length;
        this.name = cons.name;
        this.breed = cons.breed;
    
    
        this.$merge = function (mergeObj) {
            if (!mergeObj) { mergeObj = { }; }
            this.name = mergeObj.name;
            this.breed = mergeObj.breed;
        }
    }
    

    其中的额外元数据是一些支持集合和复杂类型的脚手架,能够创建继承的对象以覆盖行为等。

    注意:我是 sharp2Js 的维护者,它是新的,还没有做很多事情,但也许它可以帮助像你这样的场景。

    【讨论】:

      【解决方案3】:

      我也在考虑同样的想法,我搜索了一下,发现这个链接可能有用:http://igorshare.wordpress.com/2012/08/20/roslyn-c-is-cheating-on-me-with-javascript-or-how-to-compile-c-into-javascript/

      【讨论】:

        【解决方案4】:

        我不确定我是否能理解您在说什么,但如果您使用反射,您可以获得有关 C# 代码的数据以生成 javascript 对象的信息。

        【讨论】:

          猜你喜欢
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-03
          • 2022-07-07
          • 1970-01-01
          相关资源
          最近更新 更多