Kev*_*cht 12 c# asp.net typeconverter
我想将一个int列表(List)作为声明属性传递给Web用户控件,如下所示:
<UC:MyControl runat="server" ModuleIds="1,2,3" />
Run Code Online (Sandbox Code Playgroud)
我创建了一个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<int> list = new List<int>();
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<int>)
{
List<int> list = (List<int>)value;
ConstructorInfo construcor = typeof(List<int>).GetConstructor(new Type[] { typeof(IEnumerable<int>) });
InstanceDescriptor id = new InstanceDescriptor(construcor, new object[] { list.ToArray() });
return id;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将属性添加到我的属性:
[TypeConverter(typeof(IntListConverter))]
public List<int> ModuleIds
{
get { ... }; set { ... };
}
Run Code Online (Sandbox Code Playgroud)
但是我在运行时遇到这个错误:
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.
我的问题类似于这里发现的问题,但解决方案并没有解决我的问题:
更新:我找到了解决第一个问题的页面.我更新了上面的代码以显示我的修复程序.添加的代码是CanConvertTo和ConvertTo方法.现在我得到一个不同的错误:
Object reference not set to an instance of an object.
这个错误似乎是由ConvertTo方法中的某些东西间接引起的.
Mar*_*ett 10
在将调试器挂钩到Cassini之后,我发现null ref实际上来自System.Web.Compilation.CodeDomUtility.GenerateExpressionForValue,它基本上试图获取传递给List构造函数的int []数组的表达式.由于int []数组没有类型描述符,它会失败(并在进程中抛出一个空引用,而不是它应该生成的"无法生成属性集异常").
我无法想出一个内置的方法来获取List <int>中的可序列化值,所以我只使用了一个静态方法:
class IntListConverter : TypeConverter {
public static List<int> FromString(string value) {
return new List<int>(
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<int> list = (List<int>)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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4587 次 |
| 最近记录: |