public static void Main()
var bird = new Duck() { DuckyProperty = "23" } as IBird;
var factory = new BirdProcessorFactory();
var provider = factory.GetBirdProcessor(bird);
var weight = provider.GetBirdWeight(bird);
Console.WriteLine(weight);
public class Duck : IBird
public string DuckyProperty { get; set; }
public interface IBirdProcessor<in T> where T : IBird
double GetBirdWeight(T obj);
public class DuckProcessor : IBirdProcessor<Duck>
public double GetBirdWeight(Duck duck)
return double.Parse(duck.DuckyProperty);
public class BirdProcessorFactory
public IBirdProcessor<T> GetBirdProcessor<T>(T obj) where T : IBird
return (IBirdProcessor<T>)new DuckProcessor();