我正在开发一个需要很多参数的asp.net组件。它将从经典ASP调用。我当然可以通过10-20个参数,但我希望有点整洁。
我相当自信我可以传入一个数组,但理想情况下我希望能够传入一个对象。
这可能吗?
我决定做一点测试。 经典ASP:
Dim objDictionary
Set objDictionary = CreateObject("Scripting.Dictionary")
objDictionary.Add "startDate", startDate
objDictionary.Add "endDate", endDate
MyComponent.checkObj(objDictionary)
在我的ASP.net组件中,我有:
public string checkObj(object config)
{
return "StartDate is " + config.startDate;
}
编辑:
我已经取得了进展,所以我改变了这个: 我创建了一个抽象类,现在它正在检查它并完美地构建。在运行时我现在得到和错误 - Microsoft VBScript运行时错误:无效的过程调用或参数:'checkObj'。
是否可以将集合传递给com程序集?
也许问题是com组件正在接收Scripting.Dictionary类型的对象,而不是我创建的抽象类,但是.net中不存在这样的东西?
答案 0 :(得分:1)
您可以尝试在asp页面中使用.net对象,如System.Collections.ArrayList或System.Collections.Hashtable而不是该字典......
<%@ LANGUAGE="VBSCRIPT" %>
<%
dim netObj
set netObj = server.createobject("System.Collections.Hashtable")
' or:
'set netObj = server.createobject("System.Collections.ArrayList")
%>
这应该会使.net组件中的内容变得更容易
答案 1 :(得分:0)
我想做类似的事情,因此为.NET DataRow创建了一个包装类。如果需要,可以使用HasTable / Dictionairy /其他自定义实现作为后备存储。
我在我的包装器对象上使用Indexer属性公开我的“属性”,因此使用asp-classic中的属性看起来像这样:
Dim lngCustomerId
lngCustomerID = CLng(objectWrapper("CustomerId"))
我使用COM Registered .NET程序集公开我的包装器。我的包装器继承自DynamicObject,并通过COM可见接口公开以下内容:
[ComVisible(true)]
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IDynamicModel
{
dynamic this[string propertyName] { get; set; }
bool TryGetMember(GetMemberBinder binder, out object result);
bool TrySetMember(SetMemberBinder binder, object value);
}
我认为 TryGetMember 和 TrySetMember 不会满足您的需求。
我的包装器类实现如下所示:
[ComVisible(true)]
[Guid("YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY")]
[ProgId("COMLIB.DynamicModel")]
[ClassInterface(ClassInterfaceType.None)]
public sealed class DynamicModel : DynamicObject, IDynamicModel
{
#region indexer
public dynamic this[string propertyName]
{
get
{
dynamic propertyValue;
if (TryGetMember(propertyName, out propertyValue) != true)
{
propertyValue = null;
}
return propertyValue;
}
set
{
if (TrySetMember(propertyName, value) != true)
{
throw new ArgumentException("Cannot set property value");
}
}
}
#endregion indexer
#region Fields
private DataRow dataRow;
#endregion Fields
#region Properties
public dynamic GetAsDynamic { get { return this; } }
#endregion Properties
#region CTOR Methods
public DynamicModel()
: base()
{
DataTable dataTable = new DataTable();
this.dataRow = dataTable.NewRow();
}
public DynamicModel(DataRow dataRow)
: base()
{
this.dataRow = dataRow;
}
#endregion CTOR Methods
#region Dynamic Object Member Overrides
public override bool TryGetMember(GetMemberBinder binder, out object columnValue)
{
bool result = false;
columnValue = null;
result = TryGetMember(binder.Name, out columnValue);
return result;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
bool result = false;
result = TrySetMember(binder.Name, value);
return result;
}
#endregion Dynamic Object Member Overrides
#region Operations
public bool TryGetMember(string columnName, out dynamic columnValue)
{
bool result = false;
columnValue = null;
if (dataRow != null && dataRow.Table.Columns.Contains(columnName))
{
columnValue = dataRow[columnName];
result = true;
}
return result;
}
public bool TrySetMember(string columnName, dynamic columnValue)
{
bool result = false;
if (dataRow != null && dataRow.Table.Columns.Contains(columnName) == true)
{
dataRow[columnName] = columnValue;
result = true;
}
else
{
Type type = columnValue.GetType();
DataColumn dataColumn = new DataColumn(columnName, type);
result = TrySetDataColumn(dataColumn, type, columnValue);
}
return result;
}
private bool TrySetDataColumn(DataColumn dataColumn, Type type, object value)
{
bool result = false;
dataRow.Table.Columns.Add(dataColumn);
result = TrySetMember(dataColumn.ColumnName, value);
return result;
}
#endregion Operations
}
我希望这会有所帮助。