2010-07-16 43 views
1

是否有任何方法可以在要爲該變量分配值的函數中獲取字段的FieldInfo?獲取要分配字段的FieldInfo

見我的例子:

class SomeClass{  
    MyType myObject = SomeOtherClass.MyFunction(); 
} 

class SomeOtherClass{ 
    public static MyType MyFunction(){ 
     //Get FieldInfo about myObject here 
    } 
} 

背景:

我想要做的是能夠在「myObject的」,它指定對象應在「MyFunction的」緩存設置屬性。

回答

2

這是完全不可能的。

當函數被調用時,它不知道你將如何處理結果。

+0

我懷疑了,感謝您的快速答覆。 – Herber 2010-07-16 15:46:49

+1

@Herber:如果你喜歡一個答案,你可以upvote和/或甚至接受它^^ – tanascius 2010-07-16 15:48:35

+0

我仍然在尋找一種可能的解決方法,所以接受將不得不等待:) – Herber 2010-07-16 16:00:13

0

使用賦值運算符沒有辦法做到這一點。 MyFunction函數需要對myObject對象的引用才能確定字段信息。

您最好的選擇是,要麼轉讓前檢查或爲myObject進入MyFunction的

0

不知道這是否是您需要的資料後:但是你可以嘗試使用一個「out」參數,從而方法你打電話是否具有任務目標的知識?像這樣:

class SomeClass 
{ 
    MyType myObject; 
    public SomeClass() 
    { 
     SomeOtherClass.MyFunction(out myObject); 
    } 
} 

static class SomeOtherClass 
{ 
    public static void MyFunction(out MyType mType) 
    { 
     mType = new MyType(); 
     FieldInfo[] fInfo = mType.GetType().GetFields(); 
    } 
} 
class MyType 
{ 
    string Name; 
} 

希望幫助:¬)

+0

我正在尋找「SomeClass」中的「myObject」字段的FieldInfo,而不是「MyType」中的所有FieldInfos,如果我不清楚,很抱歉。 – Herber 2010-07-16 15:58:14

3

對不起數量銳減,我試圖回答的評論,但這是大作爲註釋工作:

在你提到的情況下,迴應我最後的回覆,這是否適合你?

class Program 
    { 
     static void Main(string[] args) 
     { 
      SomeClass sc = new SomeClass(); 
     } 
    } 
    class SomeClass 
    { 
     public MyType myObject; 
     public SomeClass() 
     { 
      SomeOtherClass.MyFunction(this); 
     } 
    } 

    static class SomeOtherClass 
    { 
     public static void MyFunction(SomeClass sClass) 
     { 
      sClass.myObject = new MyType() { Name = "Test1" }; 
      FieldInfo[] fInfo = sClass.myObject.GetType().GetFields(); 
      Console.WriteLine(fInfo[0].GetValue(sClass.myObject)); 
     } 
    } 
    class MyType 
    { 
     public string Name; 
    } 
+0

這更像是我要找的,我會給你一個upvote。然而,正如我在SLaks的評論中提到的那樣,那麼我還可以通過一個布爾到「MyFunction」並跳過反射alltogether .. – Herber 2010-07-16 16:21:10

0

確定一個最後刺傷之前,我把它叫做一個晚上......

class Program 
{ 
    static void Main(string[] args) 
    { 
     SomeClass sc = new SomeClass();    
    } 
} 

[AttributeUsage(AttributeTargets.Field)] 
public class MyAttribute : System.Attribute 
{ 
    public readonly bool Foo; 
    public MyAttribute(bool foo) 
    { 
     Foo = foo; 
    } 

} 
class SomeClass 
{ 
    [MyAttribute(true)] 
    public MyType myObject; 
    [MyAttribute(true)] 
    public int myInt; 
    public bool myBool; 
    public SomeClass() 
    { 
     SomeOtherClass.MyFunction(this); 
    } 
} 

static class SomeOtherClass 
{ 
    public static void MyFunction(SomeClass sClass) 
    { 
     sClass.myObject = new MyType() { Name = "Test1"}; 
     foreach(FieldInfo finfo in GetFeilds(sClass)) 
      Console.WriteLine(finfo.GetValue(sClass)); 
    } 

    public static IEnumerable<FieldInfo> GetFeilds(SomeClass sClass) 
    { 
     foreach (FieldInfo field in typeof(SomeClass).GetFields()) 
     { 
      foreach (Attribute attr in field.GetCustomAttributes(true)) 
      { 
       if (field.GetCustomAttributes(typeof(MyAttribute), true)!= null && ((MyAttribute)attr).Foo) 
        yield return field; 
      } 
     }    
    } 
} 

class MyType 
{ 
    public string Name; 
}