我基本上需要一个对值类型内部的私有值类型的引用.

我有以下 struct :

public struct someStruct
{
    public enum Type { AA = 0, BB = 1, CC = 1 } //this was because i first wanted to change
                                                //the switch with an array of refs but that 
                                                //also does not work in c#
    int a;
    int b;
    int c;

    public int GetTypeStrength(Type type)
    {
        switch (type)
        {
            case Type.AA: return a;
            case Type.BB: return b;
            case Type.CC: return c;
            default: return 0;
        }
    }
}

但我想将GetTypeStrength重写为类似以下内容:

public int GetTypeStrength(Type type)
{
    return Get(type)

ref int Get(Type type)
{
    switch (type)
    {
        case Type.AA: return ref a;
        case Type.BB: return ref b;
        case Type.CC: return ref c;
        default: /*throw exception*/;
    }
}

为了更好地编写更多方法, 但由于 struct 的原因,我不能返回引用. 此外,我还找到了使用扩展方法解决此问题的方法,但使用该方法时,我需要使字段成为公共的,从而打破封装,除非像Friend关键字这样的东西存在,但从我所了解的情况来看,它在C#中不存在.

那么,有没有办法让这件事奏效呢? 我正在使用unity,它需要在每一帧中被调用多次,所以反射不是一个选项.

[编辑] 下面是我想补充的一个例子:

public static someStruct operator +(someStruct sstr, Type type)
{
    sstr.Get(type)++;
    return sstr;
}

推荐答案

我还找到了使用扩展方法解决此问题的方法

从纯技术Angular 来看,您不需要扩展方法本身,您可以使用静态方法,尽管它需要对调用进行更改:

public struct SomeStruct
{
    // ...
    public int GetTypeStrength(Type type)
    {
        return Get(ref this, type);
    }
    
    static ref int Get(ref someStruct s, Type type)
    {
        switch (type)
        {
            case Type.AA: return ref s.a;
            case Type.BB: return ref s.b;
            case Type.CC: return ref s.c;
            default: throw new Exception()/*throw exception*/;
        }
    }

    public static someStruct operator +(someStruct sstr, Type type)
    {
        Get(ref sstr, type)++;
        return sstr;
    }
}

附注:

我建议将枚举名称从Type更改为,以防止名称与内置类型冲突.

Csharp相关问答推荐

在C#中使用in修饰符

哪个nuget包含SecurityStampValidatorOptions

如何在NServicebus中配置学习传输的文件夹(NService bus 8)

如何保持主摄像头视角保持一致?

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

如何告诉自己创建的NuGet包在应用程序中发生了变化?

Elasticsearch:当我try 使用c#将嵌套对象添加到filter中时出现问题

注册所有IMediatR类

Blazor在FluentButton onClick事件上设置参数

C#-VS2022:全局使用和保存时的代码清理

UWP应用程序try 将打包的本机.exe文件加载为C#程序集

在使用Audit.NET的AuditTrail实现中,如何逐月将数据摄取到AzureTableStorage?

具有可空类型的C#NOTNULL约束具有意外行为

使用System.Text.Json进行序列化时发生StackOverflow异常

无法使用[FromForm]发送带有图像和JSON的多部分请求

为什么此名称不再被识别?名称不存在于当前上下文中?

源代码生成器:CS8795分部方法';Class1.GetS2(字符串)';必须有实现部分,因为它有可访问性修饰符?

KeyDown从我的文本框中删除输入,如何停止?

如何在绑定到数据库的datagridview中向上或向下移动行

HttpClient,上传文件时实现进度