我有一个班级:
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.
答案 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。
从你的问题我相信你真的想要一个类型,你可以在运行时为它分配任何类型,但这不是泛型提供的。