2010-05-11 88 views
3

所以我寫了一些代碼以幫助快速轉換業務對象和視圖模型。不要皮條客我自己的博客,但you can find the details here如果你有興趣或需要知道。反射中的隱式類型轉換

我遇到的一個問題是我有一個自定義集合類型ProductCollection,我需要將其轉換爲模型中的字符串[]。顯然,由於沒有默認的隱式轉換,我在我的合約轉換器中遇到了異常。

所以,我想我會寫代碼的下一點點,應該解決的問題:

public static implicit operator string[](ProductCollection collection) { 
    var list = new List<string>(); 
    foreach (var product in collection) 
    { 
     if (product.Id == null) 
     { 
      list.Add(null); 
     } 
     else 
     { 
      list.Add(product.Id.ToString()); 
     } 
    } 
    return list.ToArray(); 
} 

但是,它仍然不能由同一演員主演的異常。我想知道它是否與反思有關?如果是這樣,我能在這裏做什麼?我也接受建築解決方案!

+0

您希望通過將空字符串添加到您生成的列表中來獲得什麼內在價值?就是想。 – 2010-05-11 03:35:28

+0

你說'拋出異常'但聲明瞭一個'隱式'運算符。你的意思是宣佈一個「顯式」運算符嗎?將代碼發佈到您希望觸發的位置。 – 2010-05-11 03:35:53

+0

Nathan Taylor,如果product.Id爲null,則其上的ToString()將結束該Universe。 – 2010-05-11 18:18:24

回答

3

首先,implicit運營商允許implcit轉換(無鑄造指令)。 explicit運營商經營演員。

儘管如此,這不是真正的問題。運營商不是多態(他們是超載,而不是覆蓋);也就是說,爲了利用重載運算符,您必須在定義它的類的上下文中引用一個類。

例如:

public class Foo 
{ 
    public static implicit operator Bar(Foo foo) { return new Bar(); } 
} 

public class Bar { } 

... 

void Baz() 
{ 
    Foo foo = new Foo(); 

    Bar bar = foo; // OK 

    object baz = foo; 

    bar = baz; // won't compile, there's no defined operator at the object level 

    bar = (Bar)baz; // will compile, but will fail at runtime for the same reason 
} 

不知道你在做什麼,你是如何做的,我不能提供一個有意義的替代的方式很多。然而,一些想法,:

  1. 覆蓋ToString(或使用您的實體公共基類/接口與自己的版本,如果你不想使用ToString)在你的實體,然後枚舉集合一般建設您的字符串數組
  2. 你的收藏提供一個ToStringArray功能(通過一個共同的基類或接口的方式),做類似的事情

最大的點是不使用運營商用於此目的;他們不會幫助你。

+0

這是一個非常好的解釋。謝謝! 這是一種難以理解的語言,直到尋找解決方案。 – 2010-05-11 03:44:30