首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Roslyn确定唯一标识符名

使用Roslyn确定唯一标识符名
EN

Stack Overflow用户
提问于 2015-09-18 17:29:20
回答 1查看 712关注 0票数 7

使用Roslyn,我将基于从我无法控制的代码中解析的方法符号生成C#代码。因此,该方法可以有任意数量的参数。我生成的代码包括一个接受单个参数的lambda表达式,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// I'm generating code like this
public void SomeMethod()
{
    DoSomething(x => x.Foo());
}

此代码的一个潜在问题是,包含方法是否包含一个名为x的参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// my code generator might produce this
public void SomeMethod(int x)
{
    DoSomething(x => x.Foo());
}

此代码将导致错误:

不能在此作用域中声明名为“x”的本地或参数,因为该名称在封闭的本地作用域中用于定义本地或参数。

当然可以。

为了解决这个问题,我想我可以从标识符名x开始,使用SemanticModel.LookupSymbols来查看它是否已经定义了。如果是这样的话,则使用_ (获取_x)并重复。

但这是最好的方法吗?如果是这样的话,当我只有一个方法符号时,我如何使用LookupSymbols呢?

我想到的另一个选项是只在方法符号中使用Parameters集合。我可以对它们执行相同的名称选择算法。但这样就足够了吗?例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static string GetIdentifierName(IMethodSymbol within)
{
    var proposed = "x";

    while (within.Parameters.Any(x => x.Name == proposed))
    {
        proposed = "_" + proposed;
    }

    return proposed;
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-29 06:24:30

使用SemanticModel.LookupSymbols似乎是一种不错的方法。这就是Visual将选定的代码移动到新方法的方式。查看罗斯林中的UniqueNameGenerator内部类。

至于如何使用LookupSymbols,您所拥有的只是一个方法符号:您已经将生成的DoSomething(x => x.Foo());添加到代码中,所以您拥有的不仅仅是一个方法符号,不是吗?但是在任何情况下,您都可以从IMethodSymbol获得DeclaringSyntaxReferences来访问相应的语法节点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32663184

复制
相关文章
利用 Resetter 将 Ubuntu 系发行版重置为初始状态
这个 Resetter 工具可以将 Ubuntu、 Linux Mint (以及其它基于 Ubuntu 的发行版)返回到其初始配置。
会长君
2023/04/26
1.3K0
类变量与对象变量
# 类变量与对象变量 # 代码 # coding=UTF-8,类变量与对象变量 class Robot: """表示有一个带有名字的机器人。""" # 一个类变量,用来计数机器人的数量 population = 0 # 这是一个类变量,属于Robot类 def __init__(self, name): # name变量属于一个对象(通过self分配),因此它是一个对象变量 """初始化数据""" self.name = name
benym
2022/07/14
9280
Python面向对象编程-类和对象-实例变量和类变量
实例变量是指属于特定对象的变量。每个类的实例都具有自己的实例变量,它们的值可以不同。在上面的示例中,Person 类的 name 和 age 属性都是实例变量,因为它们属于特定的 Person 对象。
玖叁叁
2023/04/19
8470
C++自定义类的对象对于其私有变量的访问
以下语法规则是不言自明的: 在自定义类A的成员函数中,可以对该类的私有成员变量进行赋值等操作,但是在类定义之外所声明的A类的对象aobj是不可以直接访问A类的私有变量的,只有通过在A类的成员函数中开放访问其私有变量的接口,对象aobj才可以对私有变量进行操作。
大忽悠爱学习
2021/11/15
1.5K0
C++ 类成员变量初始化
本文是对《Effective C++》的”Item 4: Make sure that objects are initialized before they’re used”的笔记和验证。
零式的天空
2022/03/08
9470
C++ 类成员变量初始化
本文是对《Effective C++》的”Item 4: Make sure that objects are initialized before they’re used”的笔记和验证。
mzlogin
2020/04/14
2.3K0
【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 )
" 匿名对象 " 的 作用域 仅限于其所在的 表达式 , 这句表达式 执行完毕后 , 匿名对象 自动销毁 ;
韩曙亮
2023/10/15
3960
【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 )
【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )
使用 class 关键字 , 定义 Dart 类 , 所有的 Dart 类默认继承 Object 类 , 其中定义两个变量 , 定义一个标准的构造方法 , 构造方法中使用 this.name 表示自有参数 ;
韩曙亮
2023/03/28
2K0
C++_类型&变量&类和对象
数据类型(type) 简称类型 是具有相同特征的数据的集合,是一个抽象概念 C++的数据类型主要分为三种: 原始数据类型:内置或预定义的数据类型,用户可以直接使用它们声明变量。例如:int,char,float,bool等 整数、字符、布尔型、浮点、双浮点数、void、宽字符 等 派生数据类型:从原始或内置数据类型派生的数据类型 函数 数组 指针 引用 用户自定义类型:这些数据类型由用户自己定义 类 结构体 union:在并集中,所有成员共享相同的内存位置 枚举类型 typedef:为 复杂的声明 定义 简
用户10551528
2023/05/09
3630
C++_类型&变量&类和对象
java类和对象——变量赋值方法
此处的set和get的方法可以用 atl + insert 选择Getter and Setting实现
小雨的分享社区
2022/10/26
1.1K0
Python 面向对象编程:类、对象、初始化和方法详解
Python 是一种面向对象的编程语言。在 Python 中,几乎所有东西都是对象,都具有其属性和方法。
小万哥
2023/10/25
3710
Python 面向对象编程:类、对象、初始化和方法详解
关于类的对象创建与初始化
今天,我们就来解决一个问题,一个类实例究竟要经过多少个步骤才能被创建出来,也就是下面这行代码的背后,JVM 做了哪些事情? Object obj = new Object(); 当虚拟机接受到一条 new 指令时,首先会拿指令后的参数,也就是我们类的符号引用,于方法区中进行检查,看是否该类已经被加载,如果没有则需要先进行该类的加载操作。 一旦该类已经被加载,那么虚拟机会根据类型信息在堆中分配该类对象所需要的内存空间,然后返回该对象在堆中的引用地址。 一般而言,虚拟机会在 new 指令执行结束后,显式调
Single
2018/04/17
8230
关于类的对象创建与初始化
关于类的对象创建与初始化
今天,我们就来解决一个问题,一个类实例究竟要经过多少个步骤才能被创建出来,也就是下面这行代码的背后,JVM 做了哪些事情?
Single
2018/04/10
1.7K4
关于类的对象创建与初始化
vector>初始化_vector如何重置
注意:vector<int> a(nums.begin()+1, nums.end()-2);中a包含nums.begin()+1,不包含nums.end()-2,也就是包含的区间是左闭右开区间
全栈程序员站长
2022/09/29
8870
Mysql重置初始密码的方法
以下命令行代码均在管理员模式下操作 命令行exe文件目录:C:\Windows\System32\cmd.exe -> 右键 -> 以"管理员模式运行"
红目香薰
2022/11/29
2.5K0
Mysql重置初始密码的方法
Xcode 恢复初始状态
我想问题可以是出在最新的 Xcode 11.2.1 版本上,我先下载一个 Xcode 10.3 版本看看能不能运行。
iOSDevLog
2019/12/02
2.4K0
以呼叫中心为例解释如何将有状态设计转换成无状态设计?
在日常开发中,我们经常会到"有状态"服务设计与"无状态"服务设计,何谓“无状态”?
菩提树下的杨过
2020/12/08
1.4K0
python--初始面向对象:类的相关知识,对象的相关知识
当然很简单,两个角色,1个人物,1个boss,且人物和boss都有不同的技能,比如人物用觉醒技能秒了boss,掉了xx装备,boss用大招秒了人物,人物死亡,怎么描述这种不同的人物和他们的功能呢
py3study
2018/08/02
4100
Python面向对象中的类变量,实例变量怎么来理解?
前几天在Python最强王者交流群有个叫【Chloe】的粉丝问了一个类变量和实例变量的问题,这里拿出来给大家分享下,一起学习下。
前端皮皮
2022/08/17
1.7K0
Python面向对象中的类变量,实例变量怎么来理解?
点击加载更多

相似问题

如何将列表重置为其初始状态

10

如何将所有变量重置为初始状态?

22

如何将react通量存储重置为其初始状态?

14

如何将远程git分支重置为其初始状态

213

将对象重置为初始状态

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文