c# - 制作通用属性

标签 c# .net generics properties

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

public String Value { get; set; }

public Type TheType { get; set; }

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

这在 C# 中可行吗?

最佳答案

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

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);
    }
}

关于c# - 制作通用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/271347/

相关文章:

c# - 如何将脚本错误对话框确认到 WebBrowser 中?

c# - c# 中的阴影 - 基方法被调用而不是派生

java - Gson fromJson 使用通用父类(super class)

java - 获取应用了类型参数的已实现接口(interface)的 Type 实例

java - 如何在此接口(interface)中覆盖此方法(参见代码)?

c# - 跟踪所有进程的 Windows API 调用

c# - 消除循环并改用 Linq

.net - 我们可以将 'Microsoft.ACE.Oledb.12.0.dll' 的引用添加到项目中吗

.net - Swagger 错误 用于操作的模糊 HTTP 方法 操作需要显式 HttpMethod 绑定(bind)

.net - .Net 中奇怪的随机数错误