MemoryRead <t>只有T int,float,string&amp;的sizeof(T)?

时间:2015-12-08 04:16:37

标签: c# memory

您好我现在正在编写包含MemoryRead函数的Memory类。我有第一个MemoryReadInt,但当我想到其他类型的多个函数,如字符串浮动..太多了。一个代码更改也需要在每个函数上进行更改。

所以我想到了类型。

但我卡住了。这是我的主要内容。

        Memory m = new Memory("lf2");
        Console.WriteLine("Health: " + m.MemoryRead<int>(0x00458C94, 0x2FC));
        m.CloseMemoryprocess();

现在这是函数

    public int MemoryRead<T>(int baseAdresse, params int[] offsets)
    {

        if(!ProcessExists())
            return -1;

        uint size = sizeof(T); << this cause the error
        byte[] buffer = new byte[size];

因为我需要sizeof因为我需要定义缓冲区的大小。

此外,返回值也会很快改变为T.所以我不知道我能在这做什么。我希望你能帮助我。

顺便说一下,我现在只想使用string,int,float。我可以限制它吗?

1 个答案:

答案 0 :(得分:0)

我想我需要回答我自己的问题。经过长时间的研究(昨天......我需要先睡觉然后发布:D)我改变了我的计划。

我首先寻找类型。 然后我去下一个MemoryRead需要一个uint大小。其中还检查类型。但是如果客户使用uint大小和T字符串。所以函数知道他想要回来。但字符串需要用户给出的大小:D

public T MemoryRead<T>(int baseAdresse, params int[] offsets) 
{

    if(!ProcessExists())
        return default(T);

    uint size = 0;

    if(typeof(T) == typeof(int)) {
        size = sizeof(int);
        return (T)(object)MemoryRead<int>(baseAdresse, size, offsets);

    } else if(typeof(T) == typeof(float)) {
        size = sizeof(float);
        return (T)(object)MemoryRead<float>(baseAdresse, size, offsets);

    } else if(typeof(T) == typeof(double)) {
        size = sizeof(double);
        return (T)(object)MemoryRead<double>(baseAdresse, size, offsets);

    }else {

        MessageBox.Show("Wrong type. Maybe you want to use MemoryRead<string>(int, uint, params [] int)", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        throw new ArgumentException("Wrong type. Maybe you want to use MemoryRead<string>(int, uint, params [] int)");

    }
}

替代方案我也可以这样做:因为重载函数需要uint ..并且用户可以忘记它转换为uint并使用int ..这只会填充参数:

    public int MemoryReadInt(int baseAdresse, params int[] offsets)
    {
        return MemoryRead<int>(baseAdresse, sizeof(int), offsets);
    }

    public string MemoryReadString(int baseAdresse, uint readSize, params int[] offsets)
    {
        return MemoryRead<string>(baseAdresse, readSize, offsets);
    }