2012-11-28 51 views
-3

我需要將對象轉換爲System.Type對象。將對象轉換爲linq中的System.Type

我讀過C#是靜態類型的,所以這是不可能的。

這是真的嗎?

如果是的話,我該如何做到這一點?

Assembly myDll = Assembly.LoadFrom(dllData.Path); 
Type manyAttribute = myDll.GetExportedTypes().FirstOrDefault(...); 
Type multiplicityAttribute = myDll.GetExportedTypes().FirstOrDefault(..); 

//Here is the problem 
propertiesOnOtherFile = propertiesOnOtherFile.Where(t => 
    t.GetCustomAttributes(false).Any(ca => 
    !string.IsNullOrEmpty(((multiplicityAttribute)ca).PropertyName))); 

這是該行:

((multiplicityAttribute)ca).PropertyName) 

是否有任何其他方式做到這一點?

編輯:

由於許多問題,這是我的範圍:

public class PocoClass 
{ 
    [ManyAttribute] 
    public ObjectX MyProp; 
} 

ManyAttribute declaration 
{ 
    public string PropertyName; 
} 

ManyAttribute是在動態地加載的DLL。 然後,如我在上面的示例中,我需要將customAttribute(ManyAttribute)強制轉換爲ManyAttribute,以便檢查PropertyName的值。

+0

我希望通過「轉換」你的意思是「鑄造」? – Mehrdad

+0

您不能靜態地將對象轉換爲由'System.Type'表示的類型。 –

+0

@Mehrdad是... – eestein

回答

2

我仍然沒有得到這個...但這應該工作。

 IEnumerable<Type> propertiesOnOtherFile = new List<Type>(); //from somewhere? 

     //Here is the problem 
     propertiesOnOtherFile = propertiesOnOtherFile.Where(t => 
      t.GetCustomAttributes(false).Any<dynamic>(ca => 
      !string.IsNullOrEmpty(ca.PropertyName))); 
+0

它看起來像你得到它:D。 propertiesOnOtherFile是我的示例文件PocoClass上的所有屬性。結果回來。謝謝。 – eestein

+1

它確實工作。使用動態關鍵字C#沒有抱怨,並允許我檢查值。再次感謝! – eestein

1

只有兩種方法可以在編譯時不知道類型的屬性/方法。你在這種情況下肯定是:

  • 反射 - 變得相當繁瑣速度非常快,即使是基本的東西,但可以讓你做你想做的幾乎任何東西。
  • dynamic - 使C#的行爲類似於動態類型語言,但不允許您執行諸如訪問其名稱也是動態的屬性。

因爲你的情況的屬性名稱也是動態的,我要說的是,答案是沒有,有沒有更好的辦法來處理對象和屬性的時候都不會在編譯時已知。

您應該儘量設計您的架構,以避免以非常動態的方式訪問對象,但建議採用特定方法的上下文太少。

0

你試圖做的事情沒有意義。

  • 此行:Type multiplicityAttribute = myDll.GetExportedTypes().FirstOrDefault(..);獲取您試圖綁定到的動態類型。
  • 然後你想投出了反對票:(multiplicityAttribute)ca)

你有什麼打算,一旦你已經將它轉換呢?

你是否:

  • 試圖獲取屬性的名稱?
  • 試圖獲取具有某些屬性的對象類型列表?
  • 試圖獲取某些靜態屬性的值?
  • 試圖獲取某個實例屬性的值,但是您不知道正在定義該實例的類的名稱?

看起來你想要做的是創建一個通用的方法來檢查事實上是非常具體的東西。使用Reflection時,往往更容易走另一個方向:首先解決具體案例,然後重構爲更一般化的方法。

+0

檢查我添加的例子,在那裏我解釋我在做什麼。 – eestein