Comment puis-je rendre cette fonction générique? Pour le moment, cette méthode récupère une liste d'éléments de type. Ce que je veux faire, c'est faire appel à cette méthode, avec un type de données générique, comme Item, Category ou Group. Tous ont le même nom de propriété.
Comment puis-je faire cela?
Dans la couche logique / service en référence à la couche de données:
public class Datatype3
{
public int ID{ get; set; }
public string Name{ get; set; }
public string Group{ get; set; }
}
Dans la couche d'accès aux données
Datatype1.cs
public class Datatype2
{
public int ID{ get; set; }
public string Name{ get; set; }
public string Group{ get; set; }
}
Datatype2.cs
public class Datatype1
{
public int ID{ get; set; }
public string Name{ get; set; }
public string Group{ get; set; }
}
Datatype3. cs
public class TaskHandler : ITaskHandler
{
public async Task<List<newDataType>> Handler(List<Item>() items)
{
var newList = new List<newDataType>();
foreach (var item in items)
{
newList.Add(new Item
{
ID = item.ID,
Name = item.Status,
Retrieved = DateTime,
});
}
return newList ;
}
}
4 Réponses :
Comme tous vos types ont la même propriété, vous devriez avoir une classe de base ou une interface commune pour eux. Ensuite, vous pouvez facilement ajouter une contrainte générique à votre méthode:
class Item : MyInterface { ...}
class Category : MyInterface { ...}
class Group : MyInterface { ...}
avec
interface MyInterface
{
// the common properties
}
et
public async Task<List<T>> Handler<T>(List<Item> items) where T: MyInterface, new()
{
var newList= new List<T>();
foreach (var item in items)
{
newList.Add(new T
{
ID = item.ID,
Name = item.Status,
Retrieved = DateTime,
});
}
// ...
}
et si ces classes ne partagent pas de propriétés>?
@styx "Tous ont le même nom de propriété."
@styx s'ils ne partagent pas de propriétés, devraient-ils avoir une méthode générique commune?
Bonjour, la dernière partie avec l'élément de classe: MYInterface, où devrait-il être? :)
Où déclarez-vous vos cours?
Les contraintes ne sont pas autorisées sur les déclarations non génériques où est le Handler ?
Les classes sont dans le projet de modèles, la catégorie, les éléments et le groupe ont leurs propres fichiers. @HimBromBeere
@HimBromBeere, merci, DownVote est revenu.
@Bladeluster Je ne vois pas pourquoi cela importe, dans quel fichier ils sont stockés. Cela signifie-t-il que vous ne pouvez pas laisser vos classes implémenter une interface? Cela aurait été un détail vraiment important pour votre question.
Pourriez-vous donner un exemple de ce à quoi devrait ressembler un type de données entièrement classe?
@Bladeluster Je ne connais pas grand-chose à vos types, donc je ne peux pas vous donner d'exemple pour eux. Si vous ne savez pas comment implémenter une interface - c'est une question complètement différente qui ne devrait certainement pas entrer dans celle existante.
Je sais comment implémenter une interface, je ne comprends tout simplement pas "comment vous les mapperiez dans une interface". Doit-il se trouver dans la couche d'accès aux données ou dans la couche logique / service? Mes modèles sont dans le DataAccessLayer.
@Bladeluster C'est là que vous déclarez ces classes. Pour moi, cela ressemble à l'accès aux données. Si votre classe est partielle code> it peut i> aller à ce dernier aussi.
@HimBromBeere J'ai mis à jour le fil. Est-ce pour plus d’aide? Où dois-je mettre l'interface commune?
Mise à jour de la classe.
Votre code est asynchrone bien qu'il n'y ait aucun appel à async. Il renvoie un "message" bien qu'il n'y ait aucune référence à une variable "message". Le code est assez illisible, il est donc difficile de savoir exactement ce que vous voulez.
Mais vous devez envelopper la méthode dans une classe générique. Peut-être que quelque chose comme ça est ce que vous voulez.
public class Foo<T> where T : new()
{
public IEnumerable<T> Handler(IEnumerable<T> items)
{
var list = new List<T>();
foreach (var item in items)
{
list.Add(new T
{
ID = item.ID,
Name = item.Status,
Retrieved = DateTime.Now,
});
}
return list;
}
}
Enveloppez votre méthode dans une classe qui peut accepter T type (où T: classe, nouvelle ()). et ajoutez votre méthode qui accepte le paramètre T-type T et renvoyer Type T d'objet.
Le message de retour peut être neuflist. P>
public class Item
{
public int ID { get; set; }
public string Status { get; set; }
}
public interface IRepositoryClass
{
int ID { get; set; }
string Name { get; set; }
DateTime Retrieved { get; set; }
}
public class YourRepositoryClass<T> where T : IRepositoryClass, new()
{
public async Task<IEnumerable<T>> Handler(List<Item> items)
{
var newList= new List<T>();
foreach (var item in items)
{
newList.Add(new T
{
ID= item.ID,
Name= item.Status,
Retrieved= DateTime,
});
}
return newList; }
}
Les classes sont dans le projet de modèles, la catégorie, les éléments et le groupe ont leurs propres fichiers.
Si tous ces classes code> ont la même méthode nommée gestionnaire code> faire quelque chose comme vous définissez un paramètre T sur le niveau d'interface et que vos méthodes peuvent utiliser ce paramètre dans leur prototype , de sorte que toute classe qui mettra en œuvre cette interface mettra naturellement implémentera naturellement le paramètre T dans ses propres méthodes. public class Consumer
{
public void Call()
{
var param1 = new List<DataType1>();
var t = new Common().Handler<DataType1>(param1).Result;
}
}
Qu'est-ce que c'est ->
List- () items
?Task?> Handler (List- () items) où T: MyInterface
Créez une interface générique avec les propriétés partagées. Laissez tous les types de données implémenter cette interface et autorisez la méthode à accepter une liste de cette interface
vous pouvez utiliser T et Interface s'ils ont tous des propriétés communes, ou vous pouvez utiliser la réflexion et obtenir tous les éléments de la classe
vous ne faites rien avec
newList, mais renvoyez desmessages?Il n'y a pas d'important où vous voulez définir l'interface, si j'étais vous, j'ai défini cette
Interfacedans une bibliothèque commune, qui peut être ajoutée comme référence là où je veux.