I have an interface defined as:
public interface MyInterface {
object foo { get; set; };
}
and a class that implements that interface:
I find Automapper very useful for converting interfaces to concrete classes.
But a List<MyInterface>
is emphatically not a List<MyClass>
.
Think:
interface IAnimal { }
class Cat : IAnimal { }
class Dog : IAnimal { }
var list = new List<IAnimal> { new Cat(), new Dog() };
Then
var cats = (List<Cat>)list;
Absurd!
Also,
var cats = list.Cast<Cat>();
Absurd!
Further
var cats = list.ConvertAll(x => (Cat)x);
Absurd!
Instead, you could say
var cats = list.OfType<Cat>();
A List<MyInterface>
cannot be converted to a List<MyClass>
in general, because the first list might contain objects that implement MyInterface
but which aren't actually objects of type MyClass
.
However, since in your case you know how you constructed the list and can be sure that it contains only MyClass
objects, you can do this using Linq:
return list.ConvertAll(o => (MyClass)o);
It is possible and that's where the generics shine! Here is a simple example:
public interface ICountable
{
int Count { get; set; }
}
public class PopularName : ICountable
{
public string Name { get; set; }
public int Count { get; set; }
}
public class PopularSize : ICountable
{
public int Size { get; set; }
public int Count { get; set; }
}
And now you need to declare your method (or your class) generic like this:
public bool HasAnyValue<T>(List<T> countableModel) where T : ICountable
{
return countableModel.Count > 0;
}
You could use Cast<>
extension method:
return list.Cast<MyClass>();