Je viens de trouver un peu de quelqu'un de code ici avait écrit pour accéder à certaines entités DB ...Utiliser `où T: SOMETHING` construire en C#
public static OurCustomObject GetOurCustomObject(int primaryKey)
{
return GetOurCustomObject<int>(primaryKey, "usp_GetOurCustomObjectByID");
}
public static OurCustomObject GetOurCustomObject(Guid uniqueIdent)
{
return GetOurCustomObject<Guid>(uniqueIdent, "usp_GetOurCustomObjectByGUID");
}
private static OurCustomObject<T>(T identifier, string sproc)
{
if((T != typeof(int)) && (T == typeof(Guid)))
{
throw new ArgumentException("Identifier must be a string or an int");
}
//ADO.NET Code to make DB Call with supplied sproc.
}
Theres juste quelque chose qui ne semble pas très generic
. Le fait que les sprocs sont passés dans la méthode intérieure est moche. mais la seule façon que je peux voir autour de ce qui est d'avoir un if/else dans la méthode privée le long des lignes de
if(type == int)
sproc = "GetByID";
else if (type == Guid)
sproc = "GetByGUID";
également le lancement d'exception est moche et ... est là de toute façon d'utiliser un où T : clause
par exemple
private static OurCustomObject<T>(T identifier) where T : int OR Guid
Toutes les suggestions sur la façon de nettoyer un peu.
Qu'est-ce que vous utilisez « T » dans le corps de la méthode? –
C'est juste que ce n'était pas spécifiquement utilisé. Il y a eu la vérification typeof (T) == typeof (int), puis après cela, ils exécutaient simplement le SPROC en utilisant un appel SQL Helper et en passant simplement l'identifiant en tant que paramètre. C'est pourquoi je pensais juste que l'utilisation se sentait un peu forcé –
Ensuite, je suis d'accord avec vous que cela semble être un mauvais design. Le but des méthodes génériques est d'être, bien, GENERIC. Un "générique" qui ne peut être que deux choses n'est pas très générique. Si vous n'utilisez pas T pour autre chose, alors la seule chose que vous pouvez éventuellement utiliser "identifiant" - un T non contraint dans le corps est un System.Object. Pourquoi ne pas éliminer complètement la généricité et simplement faire de "identifiant" un objet? –