- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用我无法调整的自定义 .NET DLL 进行一些 ColdFusion 10 集成。在这个过程中,除了创建 IEnumerable
之外,我已经能够做所有我需要做的事情。要传递给对象方法之一的数据类型。这是我需要与之集成的内容:
这是Set_Events
我遇到问题的方法。我可以创建应该是该枚举变量一部分的单个事件,但我无法创建它显然期望的正确变量类型。我试过这样做:
<cfset enum = createObject(".net", "System.Collections.Generic.IEnumerable__1") />
GetEnumerator()
方法:
<cfdump var="#enum.GetEnumerator()#">
The GetEnumerator method was not found.
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset eventList.Add(javacast("bigdecimal", "30.1234" )) />
An exception occurred while instantiating a Java object. The class must not be an interface or an abstract class. If the class has a constructor that accepts an argument, you must call the constructor explicitly using the init(args) method. Error : System.Collections.Generic.List__1
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset eventList.Add("foo") />
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset elemClass = createObject(".net", "System.String", "dotNetCoreProxy.jar") />
<cfset elemType = elemClass.getDotNetClass() />
<cfset eventList.init( elemType ) />
<cfset eventList.Add("foo") />
<cfdump var="#eventList#">
<cfobject type="dotnet" name="VideoWallEvent" class="Utilities.VideoWall.VideoWallEvent" assembly="#ExpandPath("Utilities.dll")#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", "dotNetCoreProxy.jar") />
<cfset elemType = VideoWallEvent.getDotNetClass() />
<cfset eventList.init( elemType ) />
<cfdump var="#eventList#">
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
<cfset UtilitiesProxy = ExpandPath("UtilitiesProxy.jar") />
<cfset DotNetCoreProxy = "dotNetCoreProxy.jar" />
<cfset CoStarUtilities = ExpandPath("CoStar.Utilities.dll") />
<h2>Try using base DLLs and DotNetCore</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#CoStarUtilities#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try using the Utilities Proxy for Everything</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#UtilitiesProxy#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", UtilitiesProxy) /> (error line)
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#">
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try using Utilities Proxy for VideoWall, and DotNetCore for List</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#UtilitiesProxy#">
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try Initing Wall Event</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#CoStarUtilities#">
<cfset VideoWallEvent.Init() />
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent.getDotNetClass())#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
<h2>Try Initing Wall Event</h2>
<cftry>
<cfobject type="dotnet" name="VideoWallEvent" class="CoStar.Utilities.VideoWall.VideoWallEvent" assembly="#CoStarUtilities#">
<cfset VideoWallEvent.Init() />
<cfset eventList = CreateObject(".net","System.Collections.Generic.List`1", DotNetCoreProxy) />
<cfdump var="#eventList.init(VideoWallEvent)#"> (error line)
<cfcatch>
<h3><cfoutput>#cfcatch.type#</cfoutput></h3>
<p><cfoutput>#cfcatch.message#: #cfcatch.detail#</cfoutput></p>
</cfcatch>
</cftry>
09:22:45.045 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 9
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
09:22:48.048 - coldfusion.runtime.dotnet.ProxyGenerationException - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 19
09:22:48.048 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 31
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
09:22:48.048 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 43
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( System.RuntimeType ).
09:22:48.048 - Object Exception - in C:/inetpub/LandsofAmerica/scribble/VideoWall/index.cfm : line 55
Unable to find a constructor for class System.Collections.Generic.List__1 that accepts parameters of type ( CoStar.Utilities.VideoWall.VideoWallEvent ).
最佳答案
如前所述,您需要使用具体类(而不是接口(interface))。但是,查看方法签名,它必须是实现 System.Collections.Generic.IEnumerable 的方法签名。 , 而不是 System.Collections.IEnumerable .后者仅适用于非泛型集合。您可以使用的通用集合的一个示例是 List<T>
, 其中 <T>
是列表包含的对象的类型。 (您需要查看您的 API 以确定对象类型)。
不幸的是......有一个issue with Generic classes .本质上是 createObject
使用的工具无法为泛型生成代理。 (博客条目说它已在 CF9 中解决,但在我的测试中,我遇到了与 9.0.1 - YMMV 相同的问题。)所以你需要自己使用 JNBProxyGUI.exe 来解决。 .坦率地说,它不是最直观的工具.. 但经过一番争论后,我设法让它在 CF9 下工作。幸运的是,这只是一次事件。
将生成的代理导出到 jar 文件后,使用博客条目中的示例创建通用 List
.只需将代理 jar 添加到程序集列表中即可。说收藏店简单Strings :
// create a generic list of strings ie new List<String>()
path = "c:/path/yourGenericsProxy.jar,c:/path/yourApplication.dll";
list = createObject(".net", "System.Collections.Generic.List__1", path);
elemClass = createObject(".net", "System.String", path);
elemType = elemClass.getDotNetClass();
list.init( elemType );
List
已初始化,您可以向其中添加一些元素:
list.add( "foo" );
list.add( "bar" );
List
进入你的方法:
// wrong: yourObject.Set_Events( list );
yourObject.Set_Events( list );
IEnumerable
不是 IEnumerator。所以
List
本身应该被传递到
set_Event
,而不是
Get_Enumerator()
(如前面的例子)。此外,当您调用
createObject
,
assemblyList 必须同时包含代理 jar 和 dll 文件 .否则方法调用可能会失败。原来这是导致后来问题的原因。
Create new Java -> .NET Project
Project > Edit Assembly List > Add
.找到并选择“mscorlib.dll”Project > Add Classes from Assembly File
.找到并选择“mscorlib.dll”System.Collections.Generic
打包点击Add
. Edit > Check All in Exposed Proxies
Project > Build
并选择新代理 jar 的路径和文件名 WEB-INF\cfclasses\dotNetProxy
中删除了所有生成的代理 jar。
除了 dotNetCoreProxy.jar。然后重新启动 CF 并运行代码。它工作得很好。字符串。 (请参阅下面的完整代码)。
using System;
using System.Text;
using System.Collections.Generic;
namespace MyLibrary
{
public class MyClass {
private IEnumerable<CustomClass> events;
public void set_Events(IEnumerable<CustomClass> evts)
{
this.events = evts;
}
public IEnumerable<CustomClass> get_Events()
{
return this.events;
}
}
}
using System;
using System.Text;
using System.Collections.Generic;
namespace MyLibrary
{
public class CustomClass
{
private string title;
public CustomClass(string title)
{
this.title = title;
}
public string getTitle()
{
return this.title;
}
public override string ToString()
{
return getTitle();
}
}
}
<cfscript>
// MUST include both proxy jar and DLL file
path = arrayToList([ExpandPath("./MyLibrary.dll"), ExpandPath("genericListAndEnumerator.jar")]);
//initialize custom class
customObj = createObject(".net", "MyLibrary.CustomClass", path).init("Blah, blah");
elemType = customObj.getDotNetClass();
// create generic list of custom class
list = CreateObject(".net","System.Collections.Generic.List__1", path);
list.init( elemType );
list.add( customObj );
// test setter
mainObj = createObject(".net", "MyLibrary.MyClass", path);
mainObj.set_Events( list );
// test getter
enum = mainObj.get_Events().getEnumerator();
writeDump(enum);
while (enum.MoveNext()) {
WriteDump("Current="& enum.Get_Current().toString());
}
</cfscript>
关于.net - 将 IEnumerable 变量从 ColdFusion 传递到 .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16742477/
任何人都可以向我解释 IEnumerable 和 IEnumerator 之间的区别是什么, 以及如何使用它们? 谢谢!!! 最佳答案 通常,一个 IEnumerable是可以枚举的对象,例如列表或数
function TSomething.Concat(const E: IEnumerable>): IEnumerable; begin Result := TConcatIterator.Cr
我正试图找到解决这个问题的办法: 给定一个 IEnumerable> 我需要一个返回输入的方法/算法,但是如果多个 IEnumerable 具有相同的元素,则每个巧合/组只返回一个。 例如 I
我有一个有趣的问题:给定一个 IEnumerable , 是否有可能产生 IEnumerable> 的序列一次将相同的相邻字符串分组? 让我解释一下。 1。基本说明示例: 考虑以下 IEnumerab
我有课 public class Test { public void M1(IEnumerable> p) { } public void M2(IEnumerable)> p) {
我尝试解决下一个练习: 输入:整数列表 count >= 1;一些正整数 k 输出:此整数的所有可能元组,长度为 k ; 例如 输入: {1, 2}; k = 4 输出: { {1, 1, 1, 1
抱歉奇怪的标题。我想要实现的目标很简单: IEnumerable> listoflist; IEnumerable combined = listoflist.CombineStuff(); 例子:
公共(public)类项目 { ... public class Order { public List Items ... } public class Customer {
我有一个 IEnumerable>我想转换为单一维度集合的集合。是否可以使用通用扩展方法来实现这一点?现在我正在这样做以实现它。 List filteredCombinations = new Lis
我有一个 IEnumerable> CustomObject在哪里有一个 x (用作键(在本例中为 1 、 2 、 3 ))和 y值(value)。一些假数据: { { {1, 2}, {2, 4
我需要做的是选择嵌套元素列表,这是我的查询 returns IEnumerable>这是我的 linq 表达式: from a in (questions.Select(x => x.AnswerLi
如何使用 LINQ(或其他方式)将 IEnumerables 的 IEnumerable 拆分为一个平面 IEnumerable? 最佳答案 enumerable.SelectMany(x => x)
例如: public interface IEnumerable { IEnumerator GetEnumerator(); } //This interface allows the c
我对 Reflection.Emit 有疑问。我想要动态创建的类,它具有 ICollection 的简单实现。我定义的所有方法都很好,而不是接下来的两个: public IEnumerator Get
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why was IEnumerable made covariant in C# 4? 我正在查看 MSDN
IEnumerator.MoveNext() 的实现是否预计会相对较快?或者如果“移动到下一项” 包括磁盘 IO、Web 请求或其他可能长时间运行的操作是否可以? 例如,我正在处理一个处理文档的项目,
以下代码创建了 List 的中间实例并在 yield 返回之前将值附加到它。有没有一种好的方法可以避免创建实例并直接 yield 返回单元格值? IEnumerable> GetStrValues()
我有两个 IEnumerable 对象,我想验证其中一个是否包含另一个的所有元素。 我正在使用 obj1.Intersect(obj2).Any() 但交集没有像我预期的那样工作。即使 obj2 中只
我正在尝试这个 MSDN page 上的例子.我试图更改 GetEnumerator 方法。我知道那似乎有些不对劲,但它符合要求然后就不会运行。错误是枚举器尚未启动,应该调用 MoveNext,但 它
我写过关于自定义 IEnumerator 的文章。从中生成 IEnumerable 的最简单方法是什么?理想的解决方案(一行代码)是是否有一些用于该目的的类。还是我必须自己创建? 最佳答案 不幸的是,
我是一名优秀的程序员,十分优秀!