具有泛型类型的C#属性

时间:2010-01-11 18:30:23

标签: c# .net generics

我有一个班级:

public class class1
{
public string Property1 {get;set;}
public int Property2 {get;set;}
}

将实例化:

var c = new class1();
c.Property1 = "blah";
c.Property2 = 666;

所以忍受我(我是泛型的新手),我需要另一个具有泛型类型属性的类,以便可以使用Property1或Property2来设置Property3:

public class Class2
{
public GenericType Property3 {get;set;}
}

我希望能够:

var c2 = new class2();
c2.Property3 = c1.Property2 // Any property of any type.

3 个答案:

答案 0 :(得分:11)

@bytenik我认为发起人要求将class3定义为包含泛型属性。这样,当他/她有一个来自class1或class2的属性时,在这种情况下是一个字符串/ int,class3的属性可以处理这两种情况。

public class Class3<T>
{
 public T Property3 {get;set;}
}

我认为海报想要这样做的意图是:

Class3.Property3 = Class2.Property2

我认为海报需要将它投射到T型才能实现。

查看为示例发布的链接:Making a generic property

以下是您可以做的事情:

namespace GenericSO
{
    public class Class1
    {
        public int property1 { get;set;}

    }

    public class Class2<T>
    {
        public T property2 { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            c1.property1 = 20;

            Class2<int> c2 = new Class2<int>();

            c2.property2 = c1.property1;
        }
    }
}

注意模板property2如何获取property1的值。 你必须告诉它什么样的通用。

答案 1 :(得分:7)

public class class1<T>
{
public T Property3 {get;set;}
}

关于问题的编辑版本:

如果你需要一个可以用任何类型设置的属性,这里最合理的解决方案是简单地使用Object类型的属性。对于C#编译器,没有办法找出你之前推入属性设置器的确切类型的实例。

答案 2 :(得分:0)

我想你可能误解了泛型。可以使用的另一个词是“模板”,但这是可以避免的,因为它用于C ++中更高级的东西。

以下将创建当前未定义类型T的泛型类。

public class Class2<T>
{
    public T Property3 { get; set; }
}

要使用此功能,您需要指定缺少的类型:

var x = new Class2<int>();

这将创建一个具有属性Property3的对象,该属性类型为int。

......或......

var y = new Class2<string>();

这将创建一个具有属性Property3的对象,该属性的类型为string。

从你的问题我相信你真的想要一个类型,你可以在运行时为它分配任何类型,但这不是泛型提供的。