2012-02-12 19 views
13

Bu mümkün görünmüyor mu? Peki en iyi çalışma nedir? Expando/dinamik mi?anonim bir arabirime dökülüyor mu?

public interface ICoOrd { 
    int x { get; set; } 
    int y { get; set; } 
}  

...

ICoOrd a = new {x = 44, y = 55}; 

ref:

+0

Sadece merak ediyorum: bunu yapmaya ne yapmaya çalışıyorsunuz? Eğer arayüz biliyorsanız, belli ki arayüz hangi işlevsellikte biliyorum, bu yüzden sadece kendi sınıfının bir örneğini oluşturabilir beri, artık bir anonim tür gerekmez bu durumda o işlevselliği sağlamak için bir sınıf uygulayabilirsiniz. – xxbbcc

+0

İsteğiniz neden bir anonim (ki bu tasarım hakkında "önemsemiyorsunuz") (neden bu tasarım hakkında "önemsediğiniz" anlamına gelir) bir Arayüz'e attı? – gdoron

+2

@gdoron: bir arayüz olması kullanışlı bir şey ve ben anon türleri (bu durumda hiçbir LINQ) iyi kullanım * kodumu basitleştirilmiş ve * niyeti yapma net ile yardımcı olduğunu tespit ettik. Bu motivasyon. Çoğunlukla ara yapılarla ilgisi var. – sgtz

cevap

27

iyi "geçici çözüm" oluşturmak ve arabirimi uygulayan normal, "adlı" türü kullanmaktır.

Ama isimsiz tip kullanılması ısrar ederlerse, ImpromptuInterface gibi dinamik bir arayüz vekil çerçevesini kullanmayı düşünün.

 var myInterface = new { x = 44, y = 55 }.ActLike<ICoOrd>(); 
+3

+1. Ayrıca bakabilirsin Clay (clay.codeplex.com) –

+0

Bu Jon Skeet yendi gibi görünüyor ... – gdoron

+2

+1 bunu bilmiyordum. Ty. – sgtz

7

Hayır, anonim türleri uygulamak asla arabirimleri. dynamic ya arabirimi atama izin vermedi, ancak sadece iki özelliklerine erişmek izin vermedi. Anonim türleri internal, bu yüzden dynamic kullanarak meclisleri karşısında onları kullanmak istiyorsanız, InternalsVisibleTo kullanmanız gerekir unutmayın.

+1

+1: ty. InternalsVisibleTo (şimdi söz konusu MS bağlantısı) üzerinde biraz okuma yaptım. Bu yardımcı olur. Biraz emek yoğun görünüyor. Alanında kullanılan InternalsVisibleTo gördünüz mü? – sgtz

+2

@sgtz: İşgücü yoğun mu? Tek bir özellik. Güçlü bir şekilde yazılmış meclisleri kullanıyorsanız biraz daha fazla iş gerektirir, ancak aksi halde çok basittir. Birim testleri için çok kullanırım. –

+6

@sgtz: InternalsVisibleTo normalde birim testi için kullanılır; Bazen bir iç sınıfa ünite testi yapmak istersiniz, ancak test düzeneğinin farklı bir montaj olmasını istersiniz. Bu yüzden test montajını içeriden öğrencilere veriyorsunuz. Üretim kodu senaryolarında nadiren kullanılır. Unutmayın, meclisler * versiyonlanabilirdir *; Bu meclislerin bütün * noktası *. Çoğu durumda, birbirinizin içlerini * gören iki meclisin * sürümlerini * bağımsız olarak değiştirmek istemezsiniz. Birbirlerini içsel olarak görmesi gereken iki meclisiniz varsa, bunları bir araya getirmeyi düşünün. –

1

Bunun eski bir soru ve cevaplar olduğunu biliyorum, ancak bunun üzerinde bazı birim testleri için aynı şeyi yapmak için bu konuda tökezledim. Daha sonra, Moq (facepalm) kullanarak böyle bir şey yaptığımı gördüm.

Ben ImpromptuInterface diğer öneri sevmem ama zaten MOQ kullanarak ve daha büyük aşağıdaki (o görüşü olup gerçektir) daha istikrarlı ve daha uzun desteklenen olacak olması gibi hissediyorum ediyorum. Sadece bu şekilde yapıyor ve bunun gibi biraz daha iyi, kabloyu alay etmenin başka bir yolu başladı ekleyerek: bir şey DÜZENLEME

public interface ICoOrd 
{ 
    int X { get; set; } 
    int Y { get; set; } 
} 

public class Sample 
{ 

    public void Test() 
    { 
     var aCord = new Mock<ICoOrd>(); 
     aCord.SetupGet(c => c.X).Returns(44); 
     aCord.SetupGet(c => c.Y).Returns(55); 

     var a = aCord.Object; 
    } 
} 

gibi

nedenle bu durum için olurdu.

İlgili konular