2010-11-12 14 views
5

Bu, .Net'deki (özellikle C#) Uzantı Yöntemi görünürlüğü hakkında bir sorudur ve neden intellisense işe yarayabilir, ancak derleyici aynı kod parçasında başarısız olur..Net Uzantı Yöntemi (bu dize Foo) Yalnızca Kısmen Görünür

Picture bu ...

Ben .Net nesneleri bir grup ve tek Uzatma Yöntemleri sınıfın oluşan 3.5 sınıf kütüphanesi. bu farklı bir ad olduğundan

using MyApp.Extensions; 

: İşte yöntemlerden biridir:

namespace MyApp.Extensions 
{ 
    public static class ExtensionMethods 
    { 
     public static string ToTitleCase(this string Origcase) 
     { string TitleCase = Origcase; 
      ... implementation ... 
      return TitleCase; 
     } 
    } 

sınıf kitaplığından kendi içinde uzatma yöntemleri kullanmak için yöntemlerden birini gerektiren her sınıf belirtmek gerekiyor kütüphanenin kalanından daha fazla. Bütün bunlar iyi çalışıyor.

Şimdi, bir .Net 2.0 web sitesi bu kitaplığa uygun şekilde başvurur ve kitaplık kullanmak isteyen bir sınıf dosyası. Yani o olduğunu bildirir: GÖRÜNÜYOR

using MyApp.Extensions 

sadece iyi çalışmak ve bir dize yazarken, IntelliSense uzatma yöntemi bir dize örneği kapalı sarkan görür: Seviyorum

http://www.flipscript.com/test/ToTitleCase.jpg

Bir plan bir araya geldiğinde! Bununla birlikte, bu neşenin sonu budur.

web sitesi oluşturma girişiminde, inşa şu iletisiyle başarısız olur:

http://www.flipscript.com/test/titlecaseerror.jpg

doğrudan web projeye ExtensionMethods sınıfını kopyalamaya çalışırken, inşa yine başarısız olur. Bu sefer, çünkü "bu" kelimesi beklenmiyordu. (Böylece sorunu "bu" anahtar sözcüğü ile aslında değil)

http://www.flipscript.com/test/titlecaseok.jpg

... ve Yapı gayet güzel çalışıyor:

Garibi, uzatma yöntemi normal statik yöntemi olarak çalışır . Aslında, build, ExtensionMethods sınıfının sınıf kitaplığında mı yoksa web sitesinde mi olduğunu çalışır. Başka bir deyişle, bu sorunu çözüyor ve yapı başarılı olacak.

... ama çözüm berbat.

Soru: Uzantı Yöntemlerinin bu senaryoda düzgün şekilde çalışmasını sağlamak için bir çeşit gizli numara var mı?

http://www.flipscript.com/test/ToTitleCase.jpg

ben "ad System.Runtime.CompilerServices" hile denedim, ama bu yardım görünmüyordu.

Intellisense bir uzantı yöntemini doğru bir şekilde görmesine neden olur ve derleyici başarısız olur?

Not: Örnek değişken, 'FirstName' yerine 'name' olarak adlandırılmış olmalıdır, ancak siz bu fikri elde edersiniz.

cevap

3

web.config içinde .net 3.5'de derlemek system.web/sayfalar/ad düğüm ekleyerek çalışacağız

<system.web> 
    .... 
    <pages ....> 
     .... 
     <namespaces> 
      .... 
      <add namespace="MyApp.Extensions" /> 
Ayrıca ASP.NET derleyici olmasını sağlamak gerekecektir

3.5 modu:

<system.codedom> 
    <compilers> 
    <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" 
       type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <providerOption name="CompilerVersion" value="v3.5"/> 
     <providerOption name="WarnAsError" value="false"/> 
    </compiler> 
</compilers> 
</system.codedom> 
+0

Kutsal bok! Bu gerçekten hile yapmak gibiydi, Marc! – Flipster

+0

Kullandığım üçüncü taraf web sitesi, bir .Net 2.0 sitesi kaldığını GEREKTİRİR. Bu gereksinimi ihlal ediyor mu? (Görmek için bazı testler yapacağım, ama cevabını, paranın doğru olduğu haliyle çarpacağım) – Flipster

+0

Geri dönüp .Net 2.0 sitesi bu konuda şikayet etmezse bunu kabul edilen cevap olarak işaretleyeceğim "CompilerVersion" özelliği. – Flipster

0

Web siteniz .Net 2.0 ile çalışıyor ve genişletme yöntemini/sınıfını desteklemiyor. Böylece .NET 2.0 derleyicisi normal statik yöntem olarak değerlendirildi. o, sadece

+0

Bzzzz, yanlış cevap, VS2008 kullanarak mümkündür. Cevabımı gör. – leppie

+0

@leppie: burada web sitesi VS2005 ile çalışıyor ... extention class/method sadece destek .net3.0 + – Harendra

+0

Ama ben VS2008 dedim :) – leppie

0

herhangi namespace içeride Extension yöntemleri tutulması tavsiye asla.

+0

Neden değil? ".Extensions kullanıyor" ifadesi tam olarak .Net çerçeve sözleşmesini takip ediyor mu? – Flipster

+0

evet öyle, ama her yerde 'using' deyimini yazma önleme için, uzantı sınıfı 'namespace-less' tutuyorum. –

+0

Sanırım uzantıları ne sıklıkta kullandığınıza bağlı olarak değişir. Yaklaşık 80 dersten sadece 2 sınıftaki uzantılara ihtiyacım var, bu yüzden diğer 78'in isim alanını kirletmeye gerçekten gerek yok. – Flipster

İlgili konular