Csharp/C#教程:将int list作为参数传递给Web用户控件分享


将int list作为参数传递给Web用户控件

我想将一个int列表(List)作为声明属性传递给Web用户控件,如下所示:

 

我创建了一个TypeConverter来执行此操作:

 public class IntListConverter : System.ComponentModel.TypeConverter { public override bool CanConvertFrom( System.ComponentModel.ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) return true; return base.CanConvertFrom(context, sourceType); } public override object ConvertFrom( System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { string[] v = ((string)value).Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); List list = new List(); foreach (string s in vals) { list.Add(Convert.ToInt32(s)); } return list } return base.ConvertFrom(context, culture, value); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(InstanceDescriptor)) return true; return base.CanConvertTo(context, destinationType); } public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(InstanceDescriptor) && value is List) { List list = (List)value; ConstructorInfo construcor = typeof(List).GetConstructor(new Type[] { typeof(IEnumerable) }); InstanceDescriptor id = new InstanceDescriptor(construcor, new object[] { list.ToArray() }); return id; } return base.ConvertTo(context, culture, value, destinationType); } } 

然后将属性添加到我的属性:

 [TypeConverter(typeof(IntListConverter))] public List ModuleIds { get { ... }; set { ... }; } 

但是我在运行时遇到这个错误:

Unable to generate code for a value of type 'System.Collections.Generic.List'1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'. This error occurred while trying to generate the property value for ModuleIds.

我的问题类似于这里发现的问题 ,但解决方案并没有解决我的问题:

更新:我找到了解决第一个问题的页面。 我更新了上面的代码以显示我的修复程序。 添加的代码是CanConvertToConvertTo方法。 现在我得到一个不同的错误:

Object reference not set to an instance of an object.

这个错误似乎是由ConvertTo方法中的某些东西间接引起的。

在将调试器挂钩到Cassini之后,我发现null ref实际上来自System.Web.Compilation.CodeDomUtility.GenerateExpressionForValue,它基本上试图获取传递给List构造函数的int []数组的表达式。 因为int []数组没有类型描述符,所以它失败了(并且在进程中抛出了一个空引用,而不是它应该的“无法生成属性集exception”)。

我无法找到一个内置的方法来获取List 中的可序列化值,所以我只使用了一个静态方法:

 class IntListConverter : TypeConverter { public static List FromString(string value) { return new List( value .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(s => Convert.ToInt32(s)) ); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(InstanceDescriptor)) { List list = (List)value; return new InstanceDescriptor(this.GetType().GetMethod("FromString"), new object[] { string.Join(",", list.Select(i => i.ToString()).ToArray()) } ); } return base.ConvertTo(context, culture, value, destinationType); } } 

虽然我不能说我对此错误有任何特殊经验,但其他来源表明您需要向InstanceDescriptor类型添加转换。 查看:

https://weblogs.asp.net/bleroy/archive/2005/04/28/405013.aspx

其中提供了原因的解释或者:

https://forums.asp.net/p/1191839/2052438.aspx#2052438

其中提供了类似于您的示例代码。

我通过创建2个属性解决了类似问题:

 public List ModuleIDs { get .... set ... } public string ModuleIDstring { get ... set ... } 

ModuleIDstring将其值集转换为列表并设置ModuleIDs属性。

这也将使ModuleID可用于PropertyGrid等。

好吧,不是最好的,类型安全的解决方案,但对我来说它是有效的。

从后面的代码传递列表…

ASPX:

  

后台代码:

 List list = new List(); list.add(1); list.add(2); list.add(3); uc.ModuleIds = list; 

我通常这样做的方法是使属性包装ViewState集合。 如果它可以工作,你的方式看起来会更好,但这将完成工作:

 public IList ModuleIds { get { string moduleIds = Convert.ToString(ViewState["ModuleIds"]) IList list = new Collection(); foreach(string moduleId in moduleIds.split(",")) { list.Add(Convert.ToInt32(moduleId)); } return list; } } 

我相信问题是集{}。 类型转换器想要将List更改回字符串,但是List CanConvertFrom()失败。

您可以将其传递给字符串并在逗号上拆分以填充私有变量。 没有归属的精确性,但会起作用。

 private List modules; public string ModuleIds { set{ if (!string.IsNullOrEmpty(value)) { if (modules == null) modules = new List(); var ids = value.Split(new []{','}); if (ids.Length>0) foreach (var id in ids) modules.Add((int.Parse(id))); } } 

我认为你最好的选择是让你的usercontrol具有DataSource风格的属性。

您将该属性作为对象,然后对IList / IEnumerable / etc执行某些类型检查以确保它是正确的。

上述就是C#学习教程:将int list作为参数传递给Web用户控件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/953822.html

(0)
上一篇 2021年11月19日
下一篇 2021年11月19日

精彩推荐