2017-09-29 6 views
0

Je voudrais créer des objets de classe Material à partir de différentes BindingSources.Constructeur avec expression lambda comme paramètre de type générique

Comment puis-je écrire une expression lambda afin de ne pas avoir à spécifier de type dans le constructeur?

Exemple:

namespace test1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Wood class defined in other assembly 
      List<Wood> woodList = new List<Wood>(); 
      woodList.Add(new Wood("Oak", 750)); 
      woodList.Add(new Wood("Spruce", 450)); 

     BindingSource bs = new BindingSource(); 
     bs.DataSource = woodList; 

     //don't want to specify type in code 
     Material<Wood> z2 = new Material<Wood>(1, bs, (i) => (Wood)(bs.Current)); 

      // Can I create object this way with lambda expression ? 
      //Material<t> z1 = new Material<t>(1, bs, (lambda expression ??)); 
    } 
} 


public class Material<T> where T : class 
{ 
    public int ID { get; set; } 
    private T _item; 
    public Material(
     int _id, 
     BindingSource _bindSource, 
     Func<object, T> _getTypeParameter) 
    { 
     this.ID = _id; 
     T _item = _getTypeParameter(_bindSource.Current); 
    } 
} 
} 

Répondre

2

Puis-je créer un objet de cette façon avec une expression lambda?

simplement: non, vous avez de fournir l'argument générique lors de l'appel d'un constructeur. Cependant, vous pouvez envelopper votre constructeur-générique dans un appel usine méthode:

Material<T> CreateMaterial<T>(int _id, BindingSource _bindSource, Func<object, T> _getTypeParameter) 
{ 
    return new Material<T>(_id, _bindingSource, _getTypeParamer); 
} 

Maintenant, le compilateur est capable de déduire le type automatiquement à partir des arguments passés:

Material<Wood> z2 = CreateMaterial(1, bs, (i) => (Wood)(bs.Current));