如何从C#中包含多个类型的函数列表中获取返回值?

时间:2016-12-03 05:23:18

标签: c# generics lambda

我正在尝试创建一个列表,用于存储项目其他部分中对变量的引用,以便我可以随时使用此列表访问其最新值。为了使事情复杂化,这些可以是任何类型。

在阅读第二个响应here后,我最终创建了两个类,第一个存储了返回变量值的函数:

public class Datum<T>{
    public string name {get; set;}
    public Func<T> getVal;

    public Datum(string name, Func<T> getVal){
        this.name = name;
        this.getVal = getVal;
    }
    public T Value { get { return getVal (); }}
}

第二个将这些数据存储在一个列表中:

    public class DataObject{
    public List<object> dataList { get; set; }
    public DataObject(){
        this.dataList = new List<object>();
        this.typeList = new List<string>();
    }
}

然后我可以实例化DataObject:

    testList = new DataObject();

使用lambda函数传递对我关心的变量的引用:

    testList.dataList.Add (new Datum<float> ("MyVariableName", () => myVariable));

所以,我现在可以添加尽可能多的不同类型的数据。我遇到的麻烦是我无法弄清楚如何在不创建新变量的情况下获取数据:

    Datum<float> thisDatum= (Datum<float>)testList.dataList [0];
    print (thisDatum.name + thisDatum.Value);

有没有办法让我可以在不创建新变量的情况下返回Value?我将在每一帧中为一些数据执行此操作,因此以这种方式继续创建新变量似乎是内存密集型的。有任何想法吗?谢谢!

编辑:为了清楚起见,我传递函数的原因是我可以在任何时候引用myVariable的当前值。例如,如果MyVariable是对自运行时开始以来帧数的引用,则调用thisDatum.Value应该在每个帧上返回不同的值。以这种方式传递函数,如链接的答案(我已经验证了这一点)所示,但该方法不允许轻松访问不同类型的变量。

2 个答案:

答案 0 :(得分:0)

我想,这会奏效:

public class Datum<T>{
    public string name {get; set;}
    public T value;

    public Datum(string name, Func<T> getVal){
        this.name = name;
        this.value = getVal();
    }
    public T Value { get { return value; }}
}

提议,为什么需要将函数传递给costructor。为什么不通过该值呢?

    public Datum(string name, T value){
        this.name = name;
        this.value = value;
    }

    .....
    var myDatum = new Datum("Name", myVariable);

答案 1 :(得分:0)

根据您的实现,您的函数只返回值

testList.dataList.Add (new Datum<float> ("MyVariableName", () => myVariable));

根本不需要整个类,而不是泛型,您可以使用object类型作为值。您可以使用Dictionary<string, object>

var testList = new Dictionary<string, object>
{
    { "MyVariableName", myStringVariable },
    { "MyAnotherVariableName", myFloatVariable }
};

然后使用它,当然你需要把它投射到你期望的类型。

float valueToUse = (float)testList.["MyAnotherVariableName"];