繁体   English   中英

C#调用泛型类方法时使用动态类型

[英]C# Using dynamic type when calling generic class methods

我正在尝试在泛型类上使用动态对象。 我以this thread的一个答案为基础,基本上建议使用动态类型而不是反射,并且由于我想提高类型安全性,我宁愿使用动态类型方法。

这是我的课程:

public class DataGrid<T>
{
    public List<T>? RawData;

    public void CreateInstance(T dataMessageType)
    {
        RawData = new List<T>();
    }

    public void GetHistoricalData(T dataMessageType)
    {         
        var item = GetDataFromSource(dataMessageType); // ommitted to simplify
        RawData?.Add(item);
    }
}

我试图在这里进一步使用:

public class MainGrid
{
    public void LoadData()
        {                
            dynamic t = GetDataType(); // this method returns a Type. Ommitted to simplify; 
            var historicalData = new DataGrid<t>(); // Error. See comment 1 below
            historicalData.CreateInstance(t); // Error. Comment 2 below
            historicalData.GetDataFromSource(t); // Error. Also comment 2 below
        }
}

评论 1:我知道这是不正确的,但我不确定如何使用动态类型而不是反射来完成。

注释 2:当我用(省略的)GetDataTypecode 方法返回的类型替换“t”时,代码编译,但出现运行时错误,提示“匹配的最佳重载方法有一些无效参数”。 我也看不到我在这里缺少什么...

如果你想要一种动态的感觉,但也比实际的动态更安全。 您可以创建自己的自定义动态对象。 你可以从这个开始:

public class MyObject : DynamicObject
{

    public override bool TrySetMember(SetMemberBinder binder, object? value)
    {
        return base.TrySetMember(binder, value);
    }

    public override bool TryGetMember(GetMemberBinder binder, out object? result)
    {
        return base.TryGetMember(binder, out result);
    }
}

所以你有能力控制一个对象的获取/设置。 我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM