Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成泛型属性_C#_.net_Generics_Properties - Fatal编程技术网

C# 生成泛型属性

C# 生成泛型属性,c#,.net,generics,properties,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#中是否可能?如果包含属性的类是泛型的,并且您使用泛型参数声明属性,则这是可能的: clas

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

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));
        }
    }
}
您必须在编译时知道类型。如果在编译时不知道类型,则必须将其存储在
对象中,在这种情况下,可以将以下属性添加到
Foo
类中:

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

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


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

属性、事件、构造函数等不能是泛型的-只有方法和类型可以是泛型的。大多数时候这不是问题,但我同意有时这是一种痛苦。Brannon的回答给出了两个合理的解决方法。

在类“Foo,我感到困惑:一个公共属性”的第二个示例中,类型声明为:“public Type theType{get;set;}”,但似乎没有在代码中使用。谢谢,该属性在原始示例中。当我尝试Brannons解决方案时,我得到一个运行时错误,说我正在转换的对象必须实现IConvertible。我是否做错了什么,因为这似乎是一个交易破坏者,除非在我有可用源代码的情况下铸造一个类;我认为对于基于类型的查找来说,
var val=obj.Prop
obj.Prop[typeof(type)]
obj.GetProp()
更简洁。
Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);

int c = foo.CastValue<int>();
public object ConvertedValue {
    get {
        return Convert.ChangeType(Value, Type);
    }
}