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

zeliai 2013-12-10 11:18:34
我自己写了一个小测试程序,试图把一个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了呀。
请帮忙看看
...全文
196 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeliai 2013-12-12
  • 打赏
  • 举报
回复
引用 4 楼 dongxinxi 的回复:
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 };
    }
}
谢谢,我是想学习一下Converter的用法,所以才提出这个问题的。 我的Converter代码要怎么改才能通过编译呢?
  • 打赏
  • 举报
回复
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 };
    }
}
zeliai 2013-12-12
  • 打赏
  • 举报
回复
自己再顶一下!
小猪八Q 2013-12-12
  • 打赏
  • 举报
回复
引用 4 楼 dongxinxi 的回复:
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 };
    }
}
四楼这个不错~
欢乐的小猪 2013-12-12
  • 打赏
  • 举报
回复
TypeConverter 这个类是在绑定的时候做转换器用的。 你建的控制台无法添加相应的dll。 如果想尝试它如果用,可以建一个wpf 应用程序,或者Silverlight应用程序。
  • 打赏
  • 举报
回复
4#你自己不看 先获得一个转换器var typeConverter = TypeDescriptor.GetConverter(typeof(Human)); 或者直接new StringToHumanTypeConverter(); if (converter.CanConvertFrom(v.GetType())) //这个方法实现不够严密 { var human = (Human)converter.ConvertFrom(v); Console.WriteLine(human.Name); }
zeliai 2013-12-12
  • 打赏
  • 举报
回复
引用 6 楼 dongxinxi 的回复:
仅仅为了通过编辑,你加上重载运算符,去掉StringToHumanTypeConverter就行 你的Converter代码本身没有问题,问题出在你调用的方式不对 (Human)v是强制转换,并不会使用你的StringToHumanTypeConverter类实现 你的代码是用的人家WPF博客吧,你得先了解一下xaml,在解析它时会使用到TypeConverter 而你的只是普通的控制台代码,运行机制就不一样
我的代码如何才能调用到Converter呢? (Human)v这个怎么改?
  • 打赏
  • 举报
回复
仅仅为了通过编辑,你加上重载运算符,去掉StringToHumanTypeConverter就行 你的Converter代码本身没有问题,问题出在你调用的方式不对 (Human)v是强制转换,并不会使用你的StringToHumanTypeConverter类实现 你的代码是用的人家WPF博客吧,你得先了解一下xaml,在解析它时会使用到TypeConverter 而你的只是普通的控制台代码,运行机制就不一样
zeliai 2013-12-11
  • 打赏
  • 举报
回复
引用 1 楼 sqlchen 的回复:
1.楼主贴错区了 2.TypeConverter 不是用来做这样的类型转换的,貌似用在wpf程序中 3.你这种场景不如给Human类加个带string参数的构造函数来得实在
我的Converter代码应该怎么改呢? 我是想学习一下Converter的用法。
sqlchen 2013-12-10
  • 打赏
  • 举报
回复
1.楼主贴错区了 2.TypeConverter 不是用来做这样的类型转换的,貌似用在wpf程序中 3.你这种场景不如给Human类加个带string参数的构造函数来得实在

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧