如何在构造函数中获取已使用参数的值(C#)

时间:2011-07-11 12:55:34

标签: c# generics parameters constructor

我有一个关于以通用方式从构造函数中获取值的问题。

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 个答案:

答案 0 :(得分:1)

关于意图的问题,你没有通用的方法来做到这一点。有关已调用的方法和提供的值的信息不会自动保存。当然,您完全能够自己跟踪这些事情,但是您必须编写每个类来明确地执行此操作。

以通用方式执行此操作会遇到麻烦。如果我这样做怎么办?

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",表示运行时或库基本上必须足够聪明才能制作对象的深层副本,以便状态不会改变。

底线是这样的:如果你需要访问传递给构造函数(或任何其他函数)的参数,你必须明确地将它们存储在某个地方。

答案 1 :(得分:0)

您无法从构造函数中获取值。您需要先将它们放在班级中的属性或字段中。您提供的示例是泛型的使用不当。最好将构造函数值放入属性并创建具有这些属性的接口。

答案 2 :(得分:0)

我用这种方法得到了我需要的东西:

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