2015-08-20 20 views
5

Farklı yöntemlerle birlikte belirli bir nesneyi tanımladığım (diyelim, Point3) bir dll var.Farklı kitaplıklar arasında nesne oluşturma

Aynı tür nesneleri kullandığım başka bir dll var, ancak bağımsızlık sağlamak istediğim için yeni bir nesne olarak belirttim Point3_. Bu sadece elemanların bir kabıdır (x, y, z).

Son olarak, her iki kütüphaneyi de kullandığım bir projem var, uyumlu tipler olduğunu varsayarak, Point3'ten Point3_'e yayınlamanın temiz bir yolu olup olmadığını bilmek istiyorum. Ben böyle bir şey istiyorum

p_ = new Point3_(p.X, p.Y, p.Z); 

: gibi Şu anda

, ben yazıyorum şey

p_ = (Point3_)p; 

Not: Bu aynısı olan ama emin değildi üzgünüm Bunu web'de nasıl arayabilirim. peşin

Teşekkür

DÜZENLEME: döküm kodunu uygulama sakıncası, ama kütüphanelerin hem farkındadır 3 projesinde, bunu yazmak istiyorum. Bu şekilde kütüphaneleri ayrı ayrı geliştirebileceğim.

cevap

2

Sen explicitimplicit, ardından p_ = p; yanı çalışacak değiştirirseniz açık bir operatöre

public class Point3_ 
{ 
    // Converts a Point3 to Point3_ by explicit casting 
    public static explicit operator Point3_(Point3 p) 
    { 
     return new Point3_(p.X, p.Y, p.Z); 
    } 
} 

uygulayarak bunu başarabilirsiniz.

5

Gerçekten değil. Tek seçenek, kendi döküm operatörlerini uygulamaktır, ancak bu, kaçınmaya çalıştığınız eşleme türünü ifade eder. Bununla birlikte, bunu sizin için halletmek için uzantı yöntemleri yazabilirsiniz - bunlar bazı birlikte kitaplıklarda veya kendi tüketici projenizde bildirilebilir. Eğer ilk kütüphanede bir arayüz beyan olsaydı

p_ = p.AsPoint3_(); 
0

olarak basitçe denilen

public static Point3_ AsPoint3_(this Point3 @this) 
{ 
    return new Point3_(@this.X, @this.Y, @this.Z); 
} 

: o zaman

public interface IPoint3 { 
    public int X; 
    ... etc ... 
} 

Ve sınıflar hem bu arabirimini uygulayan (varsayarak bu bir kütüphane diğerine başvurur, ya da muhtemelen bu arabirimi ayrı bir kitaplıkta bildirir), daha sonra bunları arama kodunuzda arabirim tarafından referans alabilirsiniz, örn .:

List<IPoint3> results = new List<IPoint3>(); 
results.Add(new Point3()); 
results.Add(new _Point3(); 

int output = results.Sum(p => p.X); 
1

Eşleştirmeyi otomatik olarak yapmak için Automapper gibi bir şeyi de kullanabilirsiniz. Aynı özellik isimlerine dayalı haritalamadır.

Mapper.CreateMap<Point3, _Point3>(); 
_Point3 point = Mapper.Map<_Point3>(new Point3()) 
İlgili konular