SORU
12 AĞUSTOS 2008, Salı


Genel tür kontrol

Bir şekilde ilkel geçirilen sınırlandırmak/zorlamak var mı?(bool, int, string, vb.)

Şimdi, genel türü) türü veya arabirim uygulaması için parametre sınırlayabilirsiniz biliyorumneredefıkra. Ancak, bu ortak bir zemin olmadığı için ilkel (AFAIK) özellikleri taşımıyor (dışındanesneönce biri diyor! :P).

Yani, benim şimdiki düşünceleri sadece dişimi sıkıp için ve büyük bir parti yapalımgeçindeyim ve bir atArgumentExceptionbaşarısızlık..


EDİT 1:

Sadece netleştirmek için:

Kod tanım gibi olmalıdır:

public class MyClass<GenericType> ....

Ve örnekleme:

MyClass<bool> = new MyClass<bool>(); // Legal
MyClass<string> = new MyClass<string>(); // Legal
MyClass<DataSet> = new MyClass<DataSet>(); // Illegal
MyClass<RobsFunkyHat> = new MyClass<RobsFunkyHat>(); // Illegal (but looks awesome!)

2 DÜZENLEYİN

@Jon Limjap - İyi bir nokta, ve bir şey zaten.. düşünüyorum eğer bu tip bir değer ya da başvuru türü.. olup olmadığını belirlemek için kullanılan genel bir yöntem yoktur eminim

Bu anında uğraşmak gibi . kullanılan yapılar hakkında endişelenmenize gerek o zaman (ama istemiyorum nesneleri bir sürü giderilmesinde yararlı olabilir ^em>BoyutuHayır ilginç sorun..? :)

İşte burada:

where T : struct

MSDN alınan.


.. Yapılabilir bunu merak ediyorum .NET 3.x kullanarak uzatma yöntemleri? Bir arabirim oluşturmak ve uzantısı arabirimi uygulayan yöntemler muhtemelen biraz şişman bir geçiş daha temiz olurdu. Artı, eğer daha sonra herhangi bir hafif özel türler uzatmaya gerek varsa, aynı arayüz, herhangi bir değişiklik ile temel koda gerekli uygulayabilirler.

Siz ne düşünüyorsunuz?

Üzücü bir haber Çerçevesinde çalışıyorum 2!! :D


3 DÜZENLEMEK

Bu Jon Limjaps Pointer.. aşağıdaki çok basit neredeyse ağlamak Çok basitti, ama kodu bir cazibe gibi çalışır, çünkü bu harika!

Yani burada ne yaptım (güleceksiniz!):

Kod, genel bir sınıf eklendi

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;
    }
}

Bu tür kontrol ve İstisna, sonra küçük yarar bir yöntem

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.");
}

O zaman yapılması gereken tek şey() EnforcePrimitiveTypesınıf kurucular. İş bitmiş! :-)

Tek dezavantajı, sadece bir istisna atar at çalışma zamanı (belli ki) yerine tasarım zamanı.. Ama bu büyütülecek bir şey değil ve olabilir aldı ile kamu hizmetleri gibi FxCop (hangi değiliz kullan at work).

Bu sefer Jon Limjap özel teşekkürler!

CEVAP
12 AĞUSTOS 2008, Salı


public class Class1<GenericType> where GenericType : struct
{
}

Bu işi yapmak için görünüyordu

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • Hak5

    Hak5

    7 EYLÜL 2005
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011