当前位置:  开发笔记 > 编程语言 > 正文

C#动态类型转换

如何解决《C#动态类型转换》经验,为你挑选了2个好方法。

我们有2个对象A和B:A是system.string,B是.net原始类型(string,int等).我们想编写通用代码来将B的转换(解析)值分配给A.任何建议?谢谢,阿迪巴尔达



1> Marc Gravell..:

最实用,最通用的字符串转换方法是TypeConverter:

public static T Parse(string value)
{
    // or ConvertFromInvariantString if you are doing serialization
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
}

更多类型具有类型转换器而不是器件IConvertible等,您还可以在新的类型中添加转换器 - 在编译时;

[TypeConverter(typeof(MyCustomConverter))]
class Foo {...}

class MyCustomConverter : TypeConverter {
     // override ConvertFrom/ConvertTo 
}

如果需要,也可以在运行时(对于您不拥有的类型):

TypeDescriptor.AddAttributes(typeof(Bar),
    new TypeConverterAttribute(typeof(MyCustomConverter)));



2> driis..:

如前所述,System.Convert和IConvertible将是第一个赌注.如果由于某种原因你不能使用它们(例如,如果内置类型的默认系统转换对你来说不够),一种方法是创建一个字典,用于保存每个转换的委托,并在其中进行查找在需要时找到正确的转换.

例如; 当您想要从String转换为X类型时,您可以拥有以下内容:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(SimpleConvert.To("5.6"));
        Console.WriteLine(SimpleConvert.To("42"));
    }
}

public static class SimpleConvert
{
    public static T To(string value)
    {
        Type target = typeof (T);
        if (dicConversions.ContainsKey(target))
            return (T) dicConversions[target](value);

        throw new NotSupportedException("The specified type is not supported");
    }

    private static readonly Dictionary> dicConversions = new Dictionary > {
        { typeof (Decimal), v => Convert.ToDecimal(v) },
        { typeof (double), v => Convert.ToDouble( v) } };
}

显然,您可能希望在自定义转换例程中做一些更有趣的事情,但它证明了这一点.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有