Как получить значение используемых параметров в конструкторе (C #) - PullRequest
0 голосов
/ 11 июля 2011

У меня вопрос о получении значений из конструктора в общем виде.

namespace myTestNamespace
{
    Public Class myTestClass()
    {
        Public myTestClass(int myInt,bool myBool, double myDouble)
        {
        //do / set something
        }

        Public myTestClass(int myInt,bool myBool)
        {
            //do / set something
        }
    }
}

Using (what you need);
Using myTestNamespace;

namespace MyIWannaLookForTheParametersName
{
    Public Class MyLookUpClass()
    {
        Public void DoSomething()
        {
        List<object> myList = new List<object>();

        myTestClass _ myTestClass = new myTestClass(1,true,2.5);
        object mySaveObject = myTestClass;

        mylist.Add(mySaveObject);

        //how do I get the info from the right constructor 
        //(I used the one with 3 parameters_
        //what was the value of myInt, myBool and myDouble
        //how can I make it generic enough, so it will work with other classes with
        // different constructors ass well?
        }
        }
    }

Ответы [ 3 ]

1 голос
/ 11 июля 2011

Вопросы о намерениях в стороне, нет никакого общего способа сделать это. Информация о том, какие методы были вызваны и какие значения были предоставлены, не сохраняется автоматически. Вы, конечно, прекрасно умеете следить за этими вещами самостоятельно, но вам придется написать каждый класс, чтобы сделать это явно.

Выполнение этого в общем виде порождает проблемы. Что если я сделал это?

public class Foo
{
    public string Name { get; set; }
}

public class Bar
{
    public Bar(Foo foo)
    {
        // ...
    }
}

Тогда предположим, что я назвал это так:

Foo f = new Foo();

f.Name = "Jim";

Bar b = new Bar(f);

f.Name = "Bob";

Теперь, если бы существовала такая общая система, каково было бы значение foo для конструктора Bar? Либо он сообщает "Bob" (то есть значение Name для экземпляра Foo, который был предоставлен), либо сообщает "Jim", что означает, что среда выполнения или библиотека должны быть достаточно умными, чтобы сделайте глубокую копию объекта, чтобы состояние не изменилось.

Суть в следующем: если вам нужен доступ к параметрам, переданным конструктору (или любой другой функции), вам придется явно их где-то хранить.

0 голосов
/ 13 июля 2011

Я получил то, что мне было нужно с этим методом:

private static ParameterSettings[] GetListOfParametersFromIndicator(object indicatorClass, int loopId, myEnums.ParaOrResult paraOrResult)
    {
        return (from prop in indicatorClass.GetType().GetProperties()
                 let loopID = loopId
                let Indicator = indicatorClass.GetType().Name
                let value = (object)prop.GetValue(indicatorClass, null)
                 where prop.Name.Contains("_Constr_")
                select new ParameterSettings { ParaOrResult=paraOrResult, LoopID= loopId, Indicator= Indicator, ParaName= prop.Name, Value= value }).ToArray();
    }

где ParameterSettings:

public struct ParameterSettings
    {
        public myEnums.ParaOrResult ParaOrResult    { get; set; }
        public int                  LoopID          { get; set; }
        public string               Indicator       { get; set; }
        public string               ParaName        { get; set; }
        public object               Value           { get; set; }
    }

Эта информация мне подходит. Спасибо за ответы.

С уважением,

Matthijs

0 голосов
/ 11 июля 2011

Вы не можете получить значения от конструктора. Вы должны сначала поместить их в свойство или поле в вашем классе. Приведенный вами пример - плохое использование генериков. Лучше было бы поместить значения конструктора в свойства и создать интерфейс с этими свойствами.

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