Home > Net >  Cast generic class object to non-generic
Cast generic class object to non-generic

Time:01-11

I have 2 classes:

public class GenericClass<T>
{
   public T Item {get;set;}
}
public class StringClass
{
  public string Item {get;set;}
}

now i have a GenericClass object and i need to cast it to StringClass object:

var genericObj = new GenericClass<string>();
var stringObj = (StringClass)genericObj; // <---

How to cast / convert from generic class to specific one?

CodePudding user response:

You can't cast one type to the other because the types are unrelated.

You could, however, define a conversion operator:

public class StringClass
{
    public string Item { get; set; }
    
    public static explicit operator StringClass(GenericClass<string> generic)
        => new StringClass { Item = generic.Item };
}

Which would allow this syntax:

var genericObj = new GenericClass<string>();
var stringObj = (StringClass)genericObj;

CodePudding user response:

You can't. You would need common inherited type or implement an interface.

With inheritance:

public class GenericClass<T>
{
   public T Item {get;set;}
}
public class StringClass : GenericClass<string>
{
}

CodePudding user response:

if your really need it, you can do this way for examle

var stringObj = new  StringClass(genericObj);

public class StringClass
{
    public string Item { get; set; }
    
    public StringClass(GenericClass<string> genericClass)
    {
        Item=genericClass.Item;
    }
 
   public StringClass(){}
}   

or this is more flexible

public interface IGenericClass<T>
{
    public T Item { get; set; }
}
public class GenericClass<T>:IGenericClass<T>
{
    public T Item { get; set; }
}
public class StringClass
{
    public string Item { get; set; }
    
    public StringClass(IGenericClass<string> genericClass)
    {
        Item=genericClass.Item;
    }
   
    public StringClass(){}
}

CodePudding user response:

Using this answer:

var genericObj = new GenericClass<string>();
var stringObj = (StringClass)Convert.ChangeType(genericObj, typeof(StringClass));
  •  Tags:  
  • Related