编辑:问题是重复的,但答案不是!
我有以下代码:
<cfquery name="contact" datasource="thesource">
SELECT * FROM #table# WHERE foo = '#bar#'
</cfquery>
Run Code Online (Sandbox Code Playgroud)
然后是(这是问题部分):
<cfloop from="0" to="9" index="i">
<cfset thisvar = Evaluate("contact.check" & i) />
<cfoutput>
#thisvar#
</cfoutput>
</cfloop>
Run Code Online (Sandbox Code Playgroud)
在执行时,它会抛出一个很好的大"变量contact.check0未定义".但是,#contact.check0#如果硬编码,输出会很好.
有想法该怎么解决这个吗?
注意:我在循环访问数据库查询结果时看到了Coldfusion - 变量字段名称,虽然问题似乎完全相同,但解决方案不起作用.根据评论,我也得到一个"无法转换为数字"的错误.我注意到Tomalak提到"有点抓",但从来没有说过它是什么.在他链接到的文章中,我尝试了每个语法上等效的形式,并且它都会抛出错误...要么无法转换为数字,要么未定义.
此外,我知道Evaluate()有开销和"不应该使用".我会采取任何有效的解决方案,无论是否有评估.
这是在ColdFusion 9上.
谢谢
编辑:虽然类似的问题已经有了答案,但这个问题有不同的原因.见下面接受的答案.
我正在尝试LINQ使用动态表名执行一些命令。例如,代替:
var o = (from x in context.users select x);
Run Code Online (Sandbox Code Playgroud)
我想使用类似:
var o = (from x in getTableObjectByName("users", context) select x);
Run Code Online (Sandbox Code Playgroud)
或多或少。到目前为止,这是我编译和运行的代码:
using (MySiteEntities ipe2 = new MySiteEntities()) {
var propinfo1 = Type.GetType("MySiteNamespace.MySiteEntities").GetProperty("users");
var propval1 = propinfo1.GetValue(ipe2, null);
}
Run Code Online (Sandbox Code Playgroud)
运行,但始终返回零记录。用户表最明确地包含记录,无论如何,当我直接使用上述第一种方法直接调用它时,都会得到所有记录。如何修改代码以实际提取记录,而不仅仅是空集合?
编辑:我也尝试过:
using (MySiteEntities ipe = new MySiteEntities())
{
var prop = Type.GetType("MySiteNamespace.MySiteEntities").GetProperty("users");
Type dbsetType = typeof(DbSet<>);
dbsetType = dbsetType.MakeGenericType(Type.GetType("MySiteNamespace.user"));
Type t = dbsetType.GetType();
var val = prop.GetValue(ipe, null);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,代码不仅会运行,而且实际上会按预期返回结果。但是,val是一个对象。我需要将其强制转换为type DbSet<user>,这很容易,除了该参数user仅在运行时才知道....强制转换也必须是动态的。我尝试使用Convert.ChangeType(val, …