小编Jür*_*ock的帖子

在将对象转换为valuetype时,解决c#unboxing异常的最佳方法是什么?

我刚刚将一个代码片段从VB.NET转换为C#,并偶然发现了这个问题.

考虑以下代码:

    Dim x As Integer = 5
    Dim y As Object = x
    Dim z As Decimal = CType(y, Decimal)
Run Code Online (Sandbox Code Playgroud)

编译器或运行时没有错误.z是五.

现在让我们将此代码翻译为C#

    int x = 5;
    object y = x;
    decimal z = (decimal)y;
Run Code Online (Sandbox Code Playgroud)

编译器没有错误,但在运行时抛出异常:

    Cannot unbox "y" to "decimal"
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,这将是最聪明的C#方式.

目前我的代码看起来像.

    int x = 5;
    object y = x;
    decimal z = decimal.Parse(y.ToString());
Run Code Online (Sandbox Code Playgroud)

但另一种解决方案是:

    decimal z = (decimal)(int)y;
Run Code Online (Sandbox Code Playgroud)

这看起来有点混乱,但可能比decimal.Parse更少开销.

c# unboxing

4
推荐指数
2
解决办法
4649
查看次数

为什么这个CLS不兼容?

我有以下接口:

public interface ITemplateItem
{
    int Id { get; set; }
    String Name { get; set; }
    String Text { get; set; }
    int  CategoryId { get; set; }
    int  Typ { get; set; }
}

public interface ITemplateCategory
{
    int Id { get; set; }
    String Name { get; set; }

    List<ITemplateItem> TemplateItems { get; set; }
    void Add(ITemplateItem item);
    void Remove(ITemplateItem item);
    ITemplateItem CreateTemplateItem();
}
Run Code Online (Sandbox Code Playgroud)

我对ITemplateItem的实现如下所示:

public class MyTemplateItem : ITemplateItem
{
    #region ITemplateItem Member
    public int Id …
Run Code Online (Sandbox Code Playgroud)

c# interface cls-compliant

4
推荐指数
1
解决办法
1689
查看次数

如何将Outlook消息从剪贴板保存到文件?

如果我从收件箱中选择Outlook邮件并将其复制到剪贴板,我可以将其作为*.msg文件粘贴到桌面.

现在我想为我的应用程序实现相同的功能.

Clipboard对象包含以下元素:

RenPrivateSourceFolder
RenPrivateMessages
RenPrivateItem
FileGroupDescriptor
FileGroupDescriptorW
FileDrop
FileNameW
FileName
FileContents
Object Descriptor
System.String
UnicodeText
Text
Run Code Online (Sandbox Code Playgroud)

FileGroupDescriptor包含MemoryStream带文件名的文件(Subject.msg),但我不知道如何从剪贴板数据中创建Outlook消息的副本,因为没有任何元素似乎包含消息本身.

有什么建议?

c# clipboard outlook msg

4
推荐指数
1
解决办法
4167
查看次数

使用IN子查询改进MySQL查询

我有桌子items和桌子item_attributes.

为简单起见,假设我的表项有一列id和一列name.对于cource,id列上有一个索引.

item_attributes表具有的列id,item_id,attribute_nameattribute_value和索引ONattrubute_name

现在我想查询具有特定属性的所有项目而不使用连接.

我使用以下查询执行此操作:

SELECT *
FROM items i
WHERE i.id IN (
    SELECT item_id
    FROM item_attributes a
    WHERE a.attribute_name = 'SomeAttribute'
      AND a.attribute_value = 'SomeValue'
)
Run Code Online (Sandbox Code Playgroud)

SubQuery本身运行得很快.

如果我首先执行查询本身并将结果用于IN查询

SELECT *
FROM items i
WHERE i.id IN (1,3,5,7,10,...)
Run Code Online (Sandbox Code Playgroud)

它也很快.

但是,组合查询非常非常慢(> 2秒).如果我调查查询计划,我明白为什么:MySQL对items表执行全表扫描,而不是先执行子查询并使用结果进行索引查询.

1, 'PRIMARY', 'items', 'ALL', '', '', '', '', 149726, 'Using where'
2, 'DEPENDENT SUBQUERY', 'item_attributes', 'index_subquery', 'IDX_ATTRIBUTE_NAME', …
Run Code Online (Sandbox Code Playgroud)

mysql query-optimization explain

4
推荐指数
1
解决办法
458
查看次数

如何在C#中将子项添加到MenuStrip的ToolStripMenuItem

我已经menustrip1在我的Windows窗体中添加了一个,我静态地添加了一个toolstripmenuitem(WindowstoolStripmenuItem)menustrip1.我已经动态创建了一个tooltripmenuitem.我想将这个动态的toolstripmenuitem添加到静态menustripitem(WindowstoolStripmenuItem)中,该静态menustripitem是在设计时静态创建的.

ToolStripMenuItem itm = new ToolStripMenuItem();
itm.Name = "fm1";
itm.Text = "Form1";
Run Code Online (Sandbox Code Playgroud)

如何将此子项添加到静态menustrip的Windows项目中.

c# menustrip winforms

4
推荐指数
1
解决办法
2万
查看次数

如何编写一个可以在不命名的情况下访问属性的类

我有关于VB/C#的(转储)问题

我经常使用第三方类,我只能指定id或key来访问子对象.

例:

而不是写:

DataRow row = GetAPopulatedDataRowSomeWhere();
Object result = row.Items[1]; // DataRow has no Items property
Object result = row.Items["colName"]; // Also not possible
Run Code Online (Sandbox Code Playgroud)

我使用此代码访问成员:

DataRow row = GetAPopulatedDataRowSomeWhere();
Object result = row[1];
Object result = row["colName"];
Run Code Online (Sandbox Code Playgroud)

有人能告诉我一个类如何支持这种语法?我自己的类有一个我想以这种方式访问​​的词典.

MyClass["key"]; // <- that's what I want
MyClass.SubItems["key"]; // <- that's how I use it now
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net class-design

3
推荐指数
1
解决办法
139
查看次数

无法从我的主要活动以外的活动显示Toast

我有一个名为main的Activity.如果我打电话

Toast.makeText(this, "Hello World from main", Toast.LENGTH_SHORT);
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,对于我的应用程序中的每个其他活动,我都无法显示Toast.没有例外,日志中没有任何内容,但我没有看到Toast.

我的主要活动是通过选项菜单启动另一个活动:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case R.id.main_menu_entry:

        Intent infolist = new Intent(this, infolist.class);
        startActivityForResult(infolist, R.layout.infolist);

        return true;
    default:
        return super.onOptionsItemSelected(item); 
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的infolist活动中,我有另一个选项菜单,它应该显示Toast.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.infolist_menu_entry:

                    // this Toast is never shown.
        Toast.makeText(this, "Hello World from infolist", Toast.LENGTH_Short);          
        return true;

    default:
        return super.onOptionsItemSelected(item); 
    }
}
Run Code Online (Sandbox Code Playgroud)

什么可能导致这个问题?我使用最新的SDK与Min SDK版本= 3和1.5模拟器.

java android toast android-activity

3
推荐指数
1
解决办法
3830
查看次数

Visual Studio - 我可以通过网络在CE设备上调试我的应用程序

我正在使用Visual Studio 2008为Windows CE开发应用程序.

如果我通过USB连接设备,我可以在设备上调试/部署我的应用程序.但是在CE设备上,USB连接只是作为另一个带有私有IP的网络接口出现.

现在我想知道是否可以解除USB连接,通过LAN连接(我的PC和CE设备都在同一个子网上).

c# windows-ce visual-studio

3
推荐指数
1
解决办法
3034
查看次数

为什么这段代码不会以死锁结束

我有这个C#代码:

public class Locking
{

    private int Value1; private int Value2;

    private object lockValue = new Object();
    public int GetInt1(int value1, int value2)
    {
        lock (lockValue)
        {
            Value1 = value1;
            Value2 = value2;
            return GetResult();
        }

    }

    public int GetInt2(int value1, int value2)
    {
        lock (lockValue)
        {
            return GetInt1(value1, value2);
        }
    }

    private int GetResult()
    {
        return Value1 + Value2;
    }


}
Run Code Online (Sandbox Code Playgroud)

所以基本上我期望一个死锁,如果我执行GetInt2但代码只是执行.任何好的解释.

.net c# locking c#-4.0

3
推荐指数
3
解决办法
748
查看次数

替换 AuthenticationHandler 进行集成测试

我有一个 web 应用程序,它对浏览器客户端使用表单身份验证,还对 odata 源的 api 访问使用基本身份验证。

这在生产中有效,但现在我正在努力使其可测试。

我使用 WebApplicationFactory 方法,并设法实现了这里描述的测试身份验证处理程序

https://docs.microsoft.com/aspnet/core/test/integration-tests?view=aspnetcore-3.1#mock-authentication

我的单元测试现在按预期工作。

但是我必须将Test-Scheme添加到我的Authorize属性中。

    [Authorize(Roles = "admin", AuthenticationSchemes = "BasicAuthentication,Test")]
    [ODataRoutePrefix("Customers")]
    public class CustomerController : ODataController
    {

        public CustomerController()
        {
        }

        [ODataRoute, EnableQuery]
        public IActionResult Get()
        {

            var result = new List<Customers>();

            return Ok(result);

        }
    }
Run Code Online (Sandbox Code Playgroud)

The result is that my tests work but in production I get an exception because the Test scheme is missing.

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: Error: An unhandled exception has occurred while executing the …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc asp.net-core

3
推荐指数
1
解决办法
450
查看次数