Is there a way to enforce/limit the types that are passed to primitives? (bool, int, string, etc.)
Acum, știu că puteți limita parametrul de tip generic la o implementare de tip sau de interfață prin intermediul clauzei unde . Cu toate acestea, acest lucru nu se potrivește facturii pentru primitive (AFAIK), deoarece nu toate au un teren comun (cu excepția obiectului înainte de cineva spune!: P).
Deci, gândurile mele actuale sunt doar să-mi sparg dinții și să fac o instrucțiune comutator și să arunc o eroare ArgumentException la eșec.
EDIT 1:
Doar pentru a clarifica:
Definiția codului ar trebui să fie:
public class MyClass ....
Și instanțierea:
MyClass = new MyClass();//Legal
MyClass = new MyClass();//Legal
MyClass = new MyClass();//Illegal
MyClass = new MyClass();//Illegal (but looks awesome!)
EDIT 2
@Jon Limjap - Punct bun, și ceva ce mă gândeam deja .. Sunt sigur că există o metodă generică care poate fi utilizată pentru a determina dacă tipul este de valoare sau tip de referință.
Acest lucru ar putea fi util pentru a elimina instantaneu o mulțime de obiecte pe care nu vreau să le tratez (dar atunci trebuie să vă faceți griji cu privire la structurile care sunt utilizate, cum ar fi Dimensiune ) .. Problema interesantă nu? :)
Aici este:
where T : struct
Luat de la MSDN .
Sunt curios .. Ar putea fi făcut în. NET 3.x folosind metode de extensie? Creați o interfață și implementați interfața în metodele de extensie (care ar fi probabil mai puțin curat decât un comutator de grăsime bit). În plus, dacă mai trebuie să extindeți mai târziu la oricare tip personalizat ușor, aceștia pot implementa aceeași interfață, fără modificări necesare pentru codul de bază.
Voi ce credeți?
Vestea trista este ca lucrez in cadrul 2! : D
EDIT 3
Acest lucru a fost atât de simplu ca urmare a Pointerul lui Jon Limjaps .. Atât de simplu vreau aproape să plâng, dar este minunat deoarece codul funcționează ca un farmec!
Deci, iată ce am făcut (veți râde!):
Codul a fost adăugat clasei generice
bool TypeValid()
{
//Get the TypeCode from the Primitive Type
TypeCode code = Type.GetTypeCode(typeof(PrimitiveDataType));
//All of the TypeCode Enumeration refer Primitive Types
//with the exception of Object and Empty (Null).
//Since I am willing to allow Null Types (at this time)
//all we need to check for is Object!
switch (code)
{
case TypeCode.Object:
return false;
default:
return true;
}
}
Apoi o mică metodă de utilitate pentru a verifica tipul și a arunca o excepție,
private void EnforcePrimitiveType()
{
if (!TypeValid())
throw new InvalidOperationException(
"Unable to Instantiate SimpleMetadata based on the Generic Type of '" + typeof(PrimitiveDataType).Name +
"' - this Class is Designed to Work with Primitive Data Types Only.");
}
Tot ce trebuie făcut este să apelați EnforcePrimitiveType() în constructorii de clase. Treaba făcuta! :-)
Singurul dezavantaj, aruncă doar o excepție la timpul de execuție (evident), mai degrabă decât timpul de design .. Dar asta nu este mare lucru și ar putea fi luat cu utilități ca FxCop (pe care nu o folosim la serviciu).
Mulțumiri speciale lui Jon Limjap pe aceasta!