读书人

小弟我自己写了一个TypeConverter编

发布时间: 2013-12-23 14:30:52 作者: rapoo

我自己写了一个TypeConverter,编译失败了
我自己写了一个小测试程序,试图把一个string类型转换成我想要的类型。如下所示:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
namespace ConsoleApplication3
{
public class StringToHumanTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return true;
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
Human h = new Human();
h.Name = value as string;
return h;
}
return base.ConvertFrom(context, culture, value);
}
}
[TypeConverter(typeof(StringToHumanTypeConverter))]
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
}
class Program
{
static void Main(string[] args)
{
string v = "abc";
Human h = (Human)v;
}
}
}

VC#编译错误,提示在Human h=(Human)v;这一行,error CS0030: Cannot convert type 'string' to 'ConsoleApplication3.Human'

这到底是怎么回事呢? 我在public class Human前面已经加上了TypeConverter这个Attribute了呀。
请帮忙看看
[解决办法]
1.楼主贴错区了

2.TypeConverter 不是用来做这样的类型转换的,貌似用在wpf程序中

3.你这种场景不如给Human类加个带string参数的构造函数来得实在
[解决办法]
var converter = new StringToHumanTypeConverter();
if (converter.CanConvertFrom(v.GetType())) //这个方法实现不够严密
{
var human = (Human)converter.ConvertFrom(v);
Console.WriteLine(human.Name);
}
//或者得重载运算符
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }

public static explicit operator Human(string value)
{
return new Human() { Name = value };
}
}

[解决办法]
仅仅为了通过编辑,你加上重载运算符,去掉StringToHumanTypeConverter就行

你的Converter代码本身没有问题,问题出在你调用的方式不对
(Human)v是强制转换,并不会使用你的StringToHumanTypeConverter类实现

你的代码是用的人家WPF博客吧,你得先了解一下xaml,在解析它时会使用到TypeConverter
而你的只是普通的控制台代码,运行机制就不一样
[解决办法]
4#你自己不看
先获得一个转换器var typeConverter = TypeDescriptor.GetConverter(typeof(Human));
或者直接new StringToHumanTypeConverter();
if (converter.CanConvertFrom(v.GetType())) //这个方法实现不够严密
{
var human = (Human)converter.ConvertFrom(v);
Console.WriteLine(human.Name);


}
[解决办法]
TypeConverter 这个类是在绑定的时候做转换器用的。
你建的控制台无法添加相应的dll。
如果想尝试它如果用,可以建一个wpf 应用程序,或者Silverlight应用程序。

读书人网 >C#

热点推荐