制作通用属性

Posted

技术标签:

【中文标题】制作通用属性【英文标题】:Making a generic property 【发布时间】:2010-09-21 05:51:18 【问题描述】:

我有一个存储序列化值和类型的类。我想要一个属性/方法返回已经转换的值:

public String Value  get; set; 

public Type TheType  get; set; 

public typeof(TheType) CastedValue  get  return Convert.ChangeType(Value, typeof(_Type)); 

这在 C# 中可行吗?

【问题讨论】:

通用属性会很好;我认为var val = obj.Prop<Type> 对于基于类型的查找比obj.Prop[typeof(Type)]obj.GetProp<Type>() 更简洁。 【参考方案1】:

如果包含该属性的类是泛型的,并且您使用泛型参数声明该属性,这是可能的:

class Foo<TValue> 
    public string Value  get; set; 
    public TValue TypedValue 
        get 
            return (TValue)Convert.ChangeType(Value, typeof(TValue));
        
    

另一种方法是使用通用方法:

class Foo 
    public string Value  get; set; 
    public Type TheType  get; set; 

    public T CastValue<T>() 
         return (T)Convert.ChangeType(Value, typeof(T));
    

您还可以使用System.ComponentModel.TypeConverter 类进行转换,因为它们允许类定义自己的转换器。

编辑:注意调用泛型方法时,必须指定泛型类型参数,因为编译器无法推断:

Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);

int c = foo.CastValue<int>();

你必须在编译时知道类型。如果您在编译时不知道类型,那么您必须将其存储在 object 中,在这种情况下,您可以将以下属性添加到 Foo 类中:

public object ConvertedValue 
    get 
        return Convert.ChangeType(Value, Type);
    

【讨论】:

在类 'Foo 的第二个示例中,我很困惑:声明了一个公共属性 'theType:“public Type TheType get; set; ”但似乎没有在代码中使用。谢谢, 该属性在原始示例中。我只是把它留在里面了。 当我尝试 Brannons 解决方案时,我收到一个运行时错误,说我正在投射的对象必须实现 IConvertible。我是不是做错了什么,因为这似乎是一个交易破坏者,除非在我有可用源代码的地方投射一个类。【参考方案2】:

属性、事件、构造函数等不能是通用的——只有方法和类型可以是通用的。大多数时候这不是问题,但我同意有时这很痛苦。布兰农的回答提供了两种合理的解决方法。

【讨论】:

【参考方案3】:

我不相信你在这里给出的例子是可能的。 CastedValue 的类型必须在编译时定义,这意味着它不能依赖于运行时值(TheType 属性的值)。

编辑:Brannon 的解决方案对于如何使用通用函数而不是属性来处理这个问题有一些很好的想法。

【讨论】:

以上是关于制作通用属性的主要内容,如果未能解决你的问题,请参考以下文章

iOS 最新证书制作流程制作通用证书

iOS 最新证书制作流程制作通用证书

如何为通用应用程序制作自动布局

Alamofire Promise 制作通用请求方法

制作通用接口数组

怎样用通用pe工具箱制作U盘启动盘