5

我想创建一个指向位置的指针列表,该位置包含另一个进程的进程内存中的某个值。该值可以是 short、int、long、string、bool 或其他值。

我的想法是为此使用泛型。我有一个问题,我怎么能告诉编译器他需要什么类型来转换字节数组?

这是我做的:

    public List<IntPtr> ScanProccessFor<T>(T ItemToScanFor)
    {
        List<IntPtr> Output = new List<IntPtr>();

        IntPtr StartOffset = SelectedProcess.MainModule.BaseAddress;
        int ScanSize = SelectedProcess.MainModule.ModuleMemorySize;

        for (int i = 0; i < ScanSize; i++)
            if (ReadMemory(SelectedProcess, StartOffset + i, (UInt16)Marshal.SizeOf(ItemToScanFor)) == ItemToScanFor)
                Output.Insert(Output.Count,StartOffset + i);

        return Output;
    }

我如何告诉编译器他需要将 byte[] 转换为 T 类型?

4

2 回答 2

2

您的问题有点混乱,但我会尽力回答

我可能不会使用泛型类型,而是编写一个方法来获取接口之类的实例IConvertableToByteArray

public IConvertableToByteArray
{    
    public byte[] ToByteArray();
}

然后,如果您需要允许特定类型与该方法兼容,则可以创建一个封装类

public IntConvertableToByteArray : IConvertableToByteArray
{
    public int Value{get; set;}

    public byte[] ToByteArray()
    {
        insert logic here
    }
}
于 2012-08-13T18:23:46.663 回答
1

您可以使用Marshal.StructureToPtr来获取结构的非托管表示(必须是“简单”结构)。不过,您可能需要特殊情况的字符串。

您还应该考虑您正在搜索的内容的对齐限制——如果项目必须对齐 4 或 8 字节,一次通过内存 1 个字节将非常缓慢和浪费。

于 2012-08-13T18:24:45.210 回答