tags:

views:

301

answers:

3

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.
+5  A: 
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.

Vitaliy Liptchinsky
Please see edit.
youwhut
youwhut you cant do that the types need to be known at compile time.
JonH
+1  A: 

@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: http://stackoverflow.com/questions/271347/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.

JonH
Do you have a casting example?
youwhut
I posted what you can do
JonH
Thank you for your help. This has got me started and the link is excellent.
youwhut
A: 

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.

Matt Breckon
It does if you cast it!
JonH
@Matt Breckon I feel that this is awkward because it will require some logic to decide which type I am using.@JonH do you have an example?
youwhut