我们知道,C#中有int.Parse,int.TryParse这样神奇的功能,那它们又是如何做到的呢?我们试着自己也来自定义一个“转换器”。

  首先,定义一个类:

    public class Human
{
public string Name { get; set; } public Human Child { get; set; }
}

  这个类具有两个属性:

  · string类型的Name

  · Human类型的Child

  现在,我期望为Human实例的Child属性赋一个Human类型的值,并且Child.Name就是这个字符串的值。

  我们先在Button1_Click事件中尝试着这样写:

        private void button1_Click(object sender, RoutedEventArgs e)
{
Human h = (Human)this.FindResource("human");
MessageBox.Show(h.Child.Name);
}

  运行后报错,告诉Child不存在,为什么Child不存在呢?原因很简单,Human实例的Child属性是Human类型,而“ABC”是一个字符串,编译器不知道如何将一个字符串实例转换成一个Human实例。那我们应该怎么做呢?办法是使用TypeConverter和TypeConvertAttribute这两个类。
  

  首先,我们要从TypeConverter中派生出自己的类,并重写它的一个ConvertFrom方法。这个方法有一个参数名为value,我们要做的就是讲这个值“翻译”成合适的值赋给对象的属性:

using System.ComponentModel;

    public class StringToHumanTypeConverter : TypeConverter
{
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);
}
}

  有了这个类还不够,还要使用TypeConverterAttribute这个特征类把StringToHumanTypeConverter这个类“粘贴”到作为目标的Human类上。

    [TypeConverterAttribute(typeof(StringToHumanTypeConverter))]
public class Human
{
public string Name { get; set; } public Human Child { get; set; }
}

  因为特征类在使用的时候可以省略Attribute这个词,所以也可以写成:

    [TypeConverter(typeof(StringToHumanTypeConverter))]
public class Human
{
public string Name { get; set; } public Human Child { get; set; }
}

  但这样写,我们需要认清写在方括号里的是TypeConverterAttribute而不是TypeConverter。

  完成之后,再单击按钮,想要的结果就弹出来了。

TypeConverter的使用的更多相关文章

  1. C# TypeConverter 数据转换

    提供一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法. 自定义Converter: public class GenericListTypeConverter<T> : Typ ...

  2. 自定义TypeConverter把基础类型转换为复杂类型

    原文(http://tech.it168.com/d/2008-06-30/200806300953554_all.shtml) TypeConverter对于编写ASP.NET Server Con ...

  3. WPF属性与特性的映射(TypeConverter)

    1,定义一个类 public class Human { public string Name { get; set; } public Human Child { get; set; } } 2在X ...

  4. [UWP]了解TypeConverter

    1. 前言 TypeConverter是XAML解释器的幕后功臣,它做了大量工作,从WPF诞生以来,几乎每一次XAML的运作都有它的参与.虽然UWP中TypeConverter已经彻彻底底退居幕后,连 ...

  5. WPF:使用TypeConverter

    所谓TypeConverter就是类型转换器,支持两种类型之间相互转换 你可以重写转换逻辑,只要你清楚转换的协议,就可以实现类型互转. 定义一个Person类型,具有一个int类型的Age属性: pu ...

  6. 深入浅出PF 学习笔记---TypeConverter

    StringToHumanTypeConverter类(从TypeConverter继承 using System; using System.Collections.Generic; using S ...

  7. 【转】【WPF】IvalueConverter和TypeConverter

    简要说明: IValueConverter主要用于XAML绑定和数据源之间的转换 TypeConverter主要用于自定义类的属性类型之间的转换 本文主要讲解如何使用IValueConverter和T ...

  8. 自定义类型转换器之TypeConverter

    C#提供了很多类型转换的方法如ConvertToInt.int.Parse.int.tryParse等等,这些方法都能将一个C#的基本数据类型转换成另一个C#基本数据类型.那么.既然如此,C#肯定会提 ...

  9. 利用 TypeConverter,转换字符串和各种类型只需写一个函数

    本文代码基于 .NET Framework 实现. 本来只想进行简单的配置存储的,不料发现 .NET 的基本类型多达十多种.于是,如果写成下面这样,那代码可就太多了哦: // 注:`Configura ...

随机推荐

  1. openstack私有云布署实践【4.1 上层代理haproxy配置 (科兴环境)】

    官方文档上的高可用配置,它推荐的是使用haproxy的上层代理来实现服务组件的主备访问.或者负载均衡访问   一开始我也是使用haproxy来做的,但后来方式改了   测试环境:haproxy + n ...

  2. hdu1022

    #include <stdio.h>#include <string.h> int main(void){ int n,i,j,k,l; char o1[10],o2[10], ...

  3. css样式重置(初始化)收集

    淘宝的样式初始化: body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fields ...

  4. 【Shell】Linux中分区脚本

    后天要中期答辩了,今天只刷了一个题,还没写出来,但是想更新博客,所以只有把之前写的东西贴出来了. 一个用于分区的shell脚本 1 #!/bin/bash #指定脚本解释器路径 2 echo &quo ...

  5. cmstop核心

    控制器在什么时候实例化?  ---每发送一次请求,都要从入口文件开始一步步往下走 index.php入口文件-->到第二个文件(核心文件cmstop.php)中实例化controller类核心文 ...

  6. AWS ec2 vpn 搭建(20161014更新http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm)

    1.原来的SoftEther VPN Server在pc端不可用了,没找到原因,因此有搜索到了一个新方法,转自http://blog.csdn.net/henryng1994/article/deta ...

  7. TortoiseGit - Win7使用Gitblit搭建Git服务器教程

    第一步:下载Java并且安装 第二步:配置Java环境变量环境变量 --> 系统变量1新建:变量名:JAVA_HOME变量值:D:\Program Files (x86)\Java\jdk1.6 ...

  8. MFC HTTP

    CInternetSession m_winet(NULL,,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,); CHttpConnection *pConnection; ...

  9. WebService 调用三种方法

    //来源:http://www.cnblogs.com/eagle1986/archive/2012/09/03/2669699.html 最近做一个项目,由于是在别人框架里开发app,导致了很多限制 ...

  10. Html 嵌入 swf

    1. object + embed       传统的方法 优点:浏览器兼容性好,是 Macromedia 一直以来的官方方法缺点:a.embed 标签是不符合 W3C 的规范的,无法通过验证.当然, ...