- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们正在使用这个组件 www.codeeffects.com这使我们能够根据对象属性创建业务规则。
View 的html是这样的:
@{
ViewBag.Title = "Post Example";
Html.CodeEffects().Styles()
.SetTheme(ThemeType.Gray)
.Render();
}
@using (Html.BeginForm("Evaluate", "Post", FormMethod.Post))
{
<div class="area">
<h1 class="title">Post Example</h1>
<div style="margin-top:10px;">
<span>Info:</span>
<span style="color:Red;">@ViewBag.Message</span>
</div>
<div style="margin-top:10px;">
@{
Html.CodeEffects().RuleEditor()
.Id("ruleEditor")
.SaveAction("Save", "Post")
.DeleteAction("Delete", "Post")
.LoadAction("Load", "Post")
.Mode(RuleType.Execution)
.ContextMenuRules(ViewBag.ContextMenuRules)
.ToolBarRules(ViewBag.ToolBarRules)
.Rule(ViewBag.Rule)
.Render();
}
</div>
</div>
<div class="area">
<h1 class="title" style="margin-top:20px;">Rule Test Form</h1>
@{
Html.RenderPartial("_PatientForm");
}
</div>
}
@{
Html.CodeEffects().Scripts().Render();
}
Controller 中的索引 Action 是这样的:
[HttpGet]
public ActionResult Index()
{
ViewBag.Rule = RuleModel.Create(typeof(Patient));
return View();
}
Patient类是这样的:
// External methods and actions
[ExternalMethod(typeof(PatientService), "IsToday")]
[ExternalAction(typeof(PatientService), "RequestInfo")]
// Dynamic Menu Data Sources; details can be found at
// http://codeeffects.com/Doc/Business-Rules-Dynamic-Menu-Data-Sources
// The getEducationTypes() client-side function declared in /Views/Shared/_Layout.cshtml
[Data("Education", "getEducationTypes")]
// The List() method declared by the Physician class
[Data("Physicians", typeof(Physician), "List")]
public class Patient
{
// C-tor
public Patient()
{
this.ID = Guid.Empty;
this.Gender = Gender.Unknown;
}
// This property will not appear in the Rule Editor - Code Effects component ignores Guids.
// Details at http://codeeffects.com/Doc/Business-Rules-Data-Types
public Guid ID { get; set; }
[Field(DisplayName = "First Name", Description = "Patient's first name", Max = 30)]
public string FirstName { get; set; }
[Field(DisplayName = "Last Name", Max = 30, Description = "Patient's last name")]
public string LastName { get; set; }
[Field(DisplayName = "Email Address", ValueInputType = ValueInputType.User, Max = 150, Description = "Email address of the patient")]
public string Email { get; set; }
[Field(DisplayName = "Date of Birth", DateTimeFormat = "MMM dd, yyyy")]
public DateTime? DOB { get; set; }
[Field(ValueInputType = ValueInputType.User, Description = "Patient's gender")]
public Gender Gender { get; set; }
// This field uses the "Physicians" dynamic menu source (declared at class level)
[Field(DisplayName = "Physician", DataSourceName = "Physicians", Description = "Patient's primary physician")]
public int PhysicianID { get; set; }
// This field uses the "Education" client-side dynamic menu source (declared at class level)
[Field(DisplayName = "Education", DataSourceName = "Education", Description = "Patient's education level")]
public int EducationTypeID { get; set; }
[Field(Min = 0, Max = 200, Description = "Current pulse")]
public int? Pulse { get; set; }
[Field(Min = 0, Max = 200, DisplayName = "Systolic Pressure", Description = "Current systolic pressure")]
public int? SystolicPressure { get; set; }
[Field(Min = 0, Max = 200, DisplayName = "Diastolic Pressure", Description = "Current Diastolic pressure")]
public int? DiastolicPressure { get; set; }
[Field(Min = 0, Max = 110, Description = "Current temperature")]
public decimal? Temperature { get; set; }
[Field(DisplayName = "Headaches Box", Description = "Does the patient have frequent headaches?")]
public bool Headaches { get; set; }
[Field(DisplayName = "Allergies Box", Description = "Any allergies?")]
public bool Allergies { get; set; }
[Field(DisplayName = "Tobacco Box", Description = "Does the patient smoke?")]
public bool Tobacco { get; set; }
[Field(DisplayName = "Alcohol Box", Description = "Alcohol use?")]
public bool Alcohol { get; set; }
public Address Home { get; set; }
public Address Work { get; set; }
// This property is used to display outputs of rule actions
[ExcludeFromEvaluation]
public string Output { get; set; }
[Method("Full Name", "Joins together patient's first and last names")]
public string FullName()
{
return string.Format("{0} {1}", this.FirstName, this.LastName);
}
// Empty overload of the Register method.
// No Method attribute is needed here because its
// display name is the same as its declared name.
[Action(Description = "Registers new patient")]
public void Register()
{
this.Output = "The patient has been registered";
}
// Overload of the Register method that takes one param.
// Both overloads can be used in Code Effects as two different actions
// as long as their display names are different.
[Action("Register with a Message", "Registers new patient with additional info")]
public void Register([Parameter(ValueInputType.User, Description = "Output message")] string message)
{
this.Output = message;
}
}
但是我们想要一个使用反射构建的动态对象,我创建的方法是这样的:
private static object CreateOurNewObject()
{
string _xml = "<root>" +
"<column name=\"Name\">Miron</column>" +
"<column name=\"LastName\">Abramson</column>" +
"<column name=\"Blog\">www.blog.mironabramson.com</column>" +
"</root>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(_xml);
// create a dynamic assembly and module
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "tmpAssembly";
System.Reflection.Emit.AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder module = assemblyBuilder.DefineDynamicModule("tmpModule");
// create a new type builder
TypeBuilder typeBuilder = module.DefineType("BindableRowCellCollection", TypeAttributes.Public | TypeAttributes.Class);
// Loop over the attributes that will be used as the properties names in out new type
foreach (XmlNode node in xmlDoc.SelectSingleNode("root").ChildNodes)
{
string propertyName = node.Attributes["name"].Value;
// Generate a private field
FieldBuilder field = typeBuilder.DefineField("_" + propertyName, typeof(string), FieldAttributes.Private);
// Generate a public property
PropertyBuilder property =
typeBuilder.DefineProperty(propertyName,
PropertyAttributes.None,
typeof(string),
new Type[] { typeof(string) });
// The property set and property get methods require a special set of attributes:
MethodAttributes GetSetAttr =
MethodAttributes.Public |
MethodAttributes.HideBySig;
// Define the "get" accessor method for current private field.
MethodBuilder currGetPropMthdBldr =
typeBuilder.DefineMethod("get_value",
GetSetAttr,
typeof(string),
Type.EmptyTypes);
// Intermediate Language stuff...
ILGenerator currGetIL = currGetPropMthdBldr.GetILGenerator();
currGetIL.Emit(OpCodes.Ldarg_0);
currGetIL.Emit(OpCodes.Ldfld, field);
currGetIL.Emit(OpCodes.Ret);
// Define the "set" accessor method for current private field.
MethodBuilder currSetPropMthdBldr =
typeBuilder.DefineMethod("set_value",
GetSetAttr,
null,
new Type[] { typeof(string) });
// Again some Intermediate Language stuff...
ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator();
currSetIL.Emit(OpCodes.Ldarg_0);
currSetIL.Emit(OpCodes.Ldarg_1);
currSetIL.Emit(OpCodes.Stfld, field);
currSetIL.Emit(OpCodes.Ret);
// Last, we must map the two methods created above to our PropertyBuilder to
// their corresponding behaviors, "get" and "set" respectively.
property.SetGetMethod(currGetPropMthdBldr);
property.SetSetMethod(currSetPropMthdBldr);
}
// Generate our type
Type generetedType = typeBuilder.CreateType();
// Now we have our type. Let's create an instance from it:
object generetedObject = Activator.CreateInstance(generetedType);
// Loop over all the generated properties, and assign the values from our XML:
PropertyInfo[] properties = generetedType.GetProperties();
int propertiesCounter = 0;
// Loop over the values that we will assign to the properties
foreach (XmlNode node in xmlDoc.SelectSingleNode("root").ChildNodes)
{
string value = node.InnerText;
properties[propertiesCounter].SetValue(generetedObject, value, null);
propertiesCounter++;
}
//Yoopy ! Return our new genereted object.
return generetedObject;
}
我们如何替换 index 操作中的行以使用该对象而不是 Patient? typeof(object),是行不通的。
最佳答案
从处理类型创建的 CreateOurNewObject() 方法中提取一部分。将其命名为 CreateType(字符串 xml)。
将 AssemblybyBuilderAccess.Run 更改为 AssemblyBuilderAccess.RunAndSave。然后,一旦创建了类型,就调用 assemblyBuilder.Save() 方法。将其保存在 Assembly.Load 将找到的位置(例如 bin 或 .net 临时文件夹之一),或任何其他只要它在搜索路径中的位置。
用它来创建类型和实例化对象。
然后,在索引中,调用
Type myType = CreateType(xml);
RuleModel.Create(myType);
如果您在外部进行评估,请确保使用相同的类型(不要每次都重新生成)。这意味着您需要先加载它。
Type myType = Assembly.Load(assemblyName);
object myObject = Activator.CreateInstance(myType);
//...populate myObject with necessary values based on your xml
Evaluator ev = new Evaluator(myType, rule);
bool result = ev.Evaluate(myObject);
或者您可以使用 DynamicEvaluator,它只调用 myObject.GetType()
DynamicEvaluator ev = new DynamicEvaluator(rule);
bool result = ev.Evaluate(myObject);
这应该有效。这里的重要部分是您首先保存您的程序集(目前无法从内存中读取),并且它位于作为搜索路径一部分的文件夹中,以便 Assembly.Load(name) 可以找到它。
关于c# - 如何使用一个动态生成的对象作为CodeEffects生成器的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34911152/
我正在尝试使用以下 keytool 命令为我的应用程序生成 keystore : keytool -genkey -alias tomcat -keystore tomcat.keystore -ke
编辑:在西里尔正确解决问题后,我注意到只需将生成轴的函数放在用于生成标签的函数下面就可以解决问题。 我几乎读完了 O'Reilly 书中关于 D3.js 的教程,并在倒数第二页上制作了散点图,但是当添
虽然使用 GraphiQL 效果很好,但我的老板要求我实现一个用户界面,用户可以在其中通过 UI 元素(例如复选框、映射关系)检查呈现给他们的元素并获取数据,这样做将为该人生成 graphql 输入,
我尝试在 Netbean 6.8 中使用 ws-import 生成 Java 类。我想重新生成 jax-ws,因为在 ebay.api.paypalapi 包中发现了一个错误(我认为该错误是由于 Pa
我有一个 perl 脚本,它获取系统日期并将该日期写入文件名。 系统日期被分配给 TRH1 变量,然后它被设置为一个文件名。 $TRH1 =`date + %Y%m%d%H%M`; print "TR
我是 Haskell 的新手,需要帮助。我正在尝试构建一种必须具有某种唯一性的新数据类型,因此我决定使用 UUID 作为唯一标识符: data MyType = MyType { uuid ::
我制作了一个脚本,它可以根据 Mysql 数据库中的一些表生成 XML。 该脚本在 PHP 中运行。 public function getRawMaterials($apiKey, $format
所以这是我的项目中的一个问题。 In this task, we will use OpenSSL to generate digital signatures. Please prepare a f
我在 SAS LIFEREG 中有一个加速故障时间模型,我想绘制它。因为 SAS 在绘图方面非常糟糕,我想实际重新生成 R 中曲线的数据并将它们绘制在那里。 SAS 提出了一个尺度(在指数分布固定为
我正在为 Django 后端制作一个样板,并且我需要能够使它到达下一个下载它的人显然无法访问我的 secret key 的地方,或者拥有不同的 key 。我一直在研究一些选项,并在这个过程中进行了实验
我正在创建一个生成采购订单的应用程序。我可以根据用户输入的详细信息创建文本文件。我想生成一个看起来比普通文本文件好得多的 Excel。有没有可以在我的应用程序中使用的开源库? 最佳答案 目前还没有任何
我正在尝试使用 ScalaCheck 为 BST 创建一个 Gen,但是当我调用 .sample 方法时,它给了我 java.lang.NullPointerException。我哪里错了? seal
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我尝试编写一些代码,例如(在verilog中): parameter N = 128; if (encoder_in[0] == 1) begin 23 binary_out = 1;
我正忙于在 Grails 项目中进行从 MySQL 到 Postgres 的相当复杂的数据迁移。 我正在使用 GORM 在 PostGres 中生成模式,然后执行 MySQL -> mysqldump
如何使用纯 XSLT 生成 UUID?基本上是寻找一种使用 XSLT 创建独特序列的方法。该序列可以是任意长度。 我正在使用 XSLT 2.0。 最佳答案 这是一个good example 。基本上,
我尝试安装.app文件,但是当我安装并单击“同步”(在iTunes中)时,我开始在设备上开始安装,然后停止,这是一个问题,我不知道在哪里,但我看到了我无法解决的奇怪的事情: 最佳答案 似乎您没有在Xc
自从我生成 JavaDocs 以来已经有一段时间了,我确信这些选项在过去 10 年左右的时间里已经得到了改进。 我能否得到一些有关生成器的建议,该生成器将输出类似于 .Net 文档结构的 JavaDo
我想学习如何生成 PDF,我不想使用任何第三方工具,我想自己用代码创建它。到目前为止,我所看到的唯一示例是我通过在第 3 方 dll 上打开反射器查看的代码,以查看发生了什么。不幸的是,到目前为止我看
我正在从 Epplus 库生成 excel 条形图。 这是我成功生成的。 我的 table 是这样的 Mumbai Delhi Financial D
我是一名优秀的程序员,十分优秀!