获取要分配的字段的FieldInfo

时间:2010-07-16 15:38:33

标签: c# .net reflection

有没有办法在函数中获取字段的FieldInfo,该函数将为该变量赋值?

参见我的例子:

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

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

背景:

我想要做的是能够在“myObject”上设置一个属性,该属性指定该对象应该缓存在“MyFunction”中。

5 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:2)

这完全不可能。

当调用该函数时,它不知道你将对结果做什么。

答案 2 :(得分:0)

使用赋值运算符无法实现。 MyFunction函数需要对myObject对象的引用才能确定字段信息。

最好的办法是在分配前检查或将myObject传递给MyFunction

答案 3 :(得分: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;
}

希望有所帮助:¬)

答案 4 :(得分: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;
}