Получить FieldInfo поля, которое должно быть назначено - PullRequest
1 голос
/ 16 июля 2010

Есть ли способ получить FieldInfo поля в функции, которая собирается присвоить значение этой переменной?

См. Мой пример:

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

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

Справочная информация:

Я хочу установить атрибут myObject, который указывает, что объект должен быть кэширован в MyFunction.

Ответы [ 5 ]

3 голосов
/ 16 июля 2010

Извините, Гербер, я пытался ответить в комментарии, но это было слишком большим, чтобы работать как комментарий:

В случае, если вы упомянули в ответ на мой последний ответ, это работает для вас?

    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;
    }
2 голосов
/ 16 июля 2010

Это абсолютно невозможно.

Когда вызывается функция, она не знает, что вы собираетесь делать с результатом.

0 голосов
/ 16 июля 2010

ОК, последний удар перед тем, как я назову это ночью ...

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;
}   
0 голосов
/ 16 июля 2010

Не уверен, что это то, что вам нужно: Но вы можете попробовать использовать параметр "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 голосов
/ 16 июля 2010

Нет способа сделать это, используя оператор присваивания.Для функции MyFunction требуется ссылка на объект myObject, чтобы можно было определить информацию о поле.

Лучше всего либо проверить перед назначением, либо передать myObject в MyFunction

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...