首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

小弟我自己写了一个TypeConverter,编译失败了

2013-12-23 
我自己写了一个TypeConverter,编译失败了我自己写了一个小测试程序,试图把一个string类型转换成我想要的类

我自己写了一个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应用程序。

热点排行