C# Property with Generic Type [duplicate]

2020-06-09 08:45发布

问题:

I have a class:

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

Which will be instantiated:

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

So bear with me (I am new to generics), I need another class with a property of a generic type so that Property1 or Property2 can be used to set Property3:

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

I want to be able to:

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

回答1:

@bytenik I think the originator is asking that class3 be defined to contain a generic property. That way when he / she has a property from class1 or class2 which in this case is a string / int that class3's property could handle either case.

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

I think the intent is the poster wants to do this:

Class3.Property3 = Class2.Property2

I think the poster will need to cast it to type T for this to work though.

Look at the link that was posted for an example: Making a generic property

Here is what you can do:

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

Notice how your template property2 gets the value of property1. You have to tell it what kind of generic.



回答2:

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

Regarding to edited version of the question:

If you need a property, which can be set with any type, the most reasonable solution here is to simply use property of type Object. For C# compiler there is no way to find out instance of which exactly type you've previously pushed into property setter.



回答3:

I think you may have misunderstood generics. Another word that could be used is "template" but that is avoided because it is used for more advanced things in C++.

The following will create a generic class of a currently undefined type T.

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

To use this you need to specify the missing type:

var x = new Class2<int>();

This will create an object that has a property Property3 that is of type int.

... or ...

var y = new Class2<string>();

This will create an object that has a property Property3 that is of type string.

From your question I believe you actually want a type where you can assign any type to it at runtime, but this is not what generics provide.