标签: collection-initializer

使用TextBoxFor设置具有名称空间前缀的HTML属性

我正在转换一些现有的HTML以使用ASP.NET MVC,并且有一些包含输入字段的表单,这些字段具有包含命名空间前缀的附加属性(现在,我需要保留):

<input type="text" foo:required="true" foo:message="Please enter a username" />
Run Code Online (Sandbox Code Playgroud)

我想使用TextBoxForhelper方法重载,允许htmlAttributes使用collection initializer语法指定:

@Html.TextBoxFor(
    model => model.Username,
    new { foo:required="true", foo:message="Please enter a username" })
Run Code Online (Sandbox Code Playgroud)

但是,由于foo:required(etc)中的冒号,此语法无效.

相反,我不得不使用这个更详细的字典初始化语法:

@Html.TextBoxFor(
    model => model.Username,
    new Dictionary<string, object>
    {
        { "foo:required", "true" },
        { "foo:message", "Please enter a username" }
    })
Run Code Online (Sandbox Code Playgroud)

是否可以使用第一种语法的变体,以某种方式逃避(因为缺少一个更好的词)冒号?

要么

这是TextBoxFor辅助方法实际上没有帮助的情况,只是保留现有的原始HTML并添加value="@Model.UserName"input元素会更简单吗?

asp.net-mvc attributes collection-initializer

7
推荐指数
1
解决办法
5066
查看次数

为什么我允许使用对象初始化程序修改只读的属性?

我有这个简单的代码:

public static void Main(String[] args)
{
    Data data = new Data { List = { "1", "2", "3", "4" } };
    foreach (var str in data.List)
        Console.WriteLine(str);
    Console.ReadLine();
}

public class Data
{
    private List<String> _List = new List<String>();
    public List<String> List
    {
        get { return _List; }
    }
    public Data() { }
}
Run Code Online (Sandbox Code Playgroud)

所以当我创建一个Data类时:

Data data = new Data { List = { "1", "2", "3", "4" } };
Run Code Online (Sandbox Code Playgroud)

该列表中填充了字符串"1","2","3","4",即使它没有set.

为什么会这样?

c# properties object-initializers getter-setter collection-initializer

7
推荐指数
1
解决办法
634
查看次数

我可以为属性使用集合初始值设定项吗?

C#中的属性可以与集合初始值设定项一起使用吗?

例如,我想做类似以下的事情:

[DictionaryAttribute(){{"Key", "Value"}, {"Key", "Value"}}]
public class Foo { ... }
Run Code Online (Sandbox Code Playgroud)

我知道属性可以有命名参数,因为这看起来与对象初始化器非常相似,我想知道集合初始化器是否也可用.

c# attributes custom-attributes object-initializers collection-initializer

6
推荐指数
2
解决办法
5965
查看次数

在我自己的类上使用集合初始值设定项

我正在尝试将集合初始化添加到我的班级.我在这里阅读了初始化程序:https://msdn.microsoft.com/en-us/library/bb384062.aspx#Anchor_2

我会引用令我困惑的重要部分:

集合初始值设定项允许您在初始化实现IEnumerable的集合类或具有Add扩展方法的类时指定一个或多个元素初始值设定项.

好了,我要强调的词.在我阅读它时,我应该能够使用Add方法创建一个类,然后集合初始值设定项应该在这个类上工作?似乎并非如此.我注意到的一件事是它确实说了一个Add扩展方法.所以我尝试创建Add作为扩展方法,但无济于事.

这是我试过的小样本不起作用:

public class PropertySpecificationCollection
{
    private List<PropertySpecification> _internalArr;
    public void Add(PropertySpecification item)
    {
        _internalArr.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

报价是否受到其他解释的影响?我试着一遍又一遍地阅读它,看看我是否可以用其他任何方式解释它,但没有这样做.

所以我想我的问题是:我是否解释错误,是否遗漏了某些内容,或者MSDN上的收集初始化程序的描述是否有错误?

c# msdn collection-initializer

6
推荐指数
1
解决办法
147
查看次数

c#collection initializer foreach

是否有可能在c#中执行类似以下的操作?

var tigerlist = new List<Tigers>(){ Tail = 10, Teeth = 20 };

var tigers_to_cats_approximation = new List<Cat>()
{    
     foreach (var tiger in tigerlist)
     {                 
           new Cat()
           {
               Tail = tiger.Tail / 2,
               Teeth = tiger.Teeth / 3,
               HousePet = true,
               Owner = new Owner(){ name="Tim" }
           }
     }
}
Run Code Online (Sandbox Code Playgroud)

我正在做一些XML apis,进入的请求对象类似于需要出去的响应对象.如果可能,上述将是非常方便的; 比auto-mapper要多得多.

c# collection-initializer

6
推荐指数
1
解决办法
132
查看次数

使用集合初始化程序时,另一个线程可以看到部分创建的集

想象一下这个C#代码在某种方法中:

SomeClass.SomeGlobalStaticDictionary = new Dictionary<int, string>()
{
    {0, "value"},
};
Run Code Online (Sandbox Code Playgroud)

假设没有人使用任何显式内存屏障或锁定来访问字典.

如果没有进行优化,则全局字典应为null(初始值)或具有一个条目的正确构造的字典.

问题是:可以重新排序Add调用和分配给SomeGlobalStaticDictionary的效果,以便其他一些线程看到一个空的非null SomeGlobalStaticDictionary(或任何其他无效的部分构造的字典?)

如果SomeGlobalStaticDictionary是易变的,答案会改变吗?

在阅读http://msdn.microsoft.com/en-us/magazine/jj863136.aspx(以及它的第二部分)之后,我从理论上了解到,因为在源代码中分配了一个变量,其他线程可能会因为很多原因.我查看了IL代码,但问题是JIT编译器和/或CPU是否允许在分配SomGlobalStaticDictionary之前不"刷新"Add调用对其他线程的影响.

c# local-variables thread-safety collection-initializer

5
推荐指数
2
解决办法
273
查看次数

如何为Matrix类实现干净的自定义对象初始值设定项

我有一个自定义Matrix类,我想实现一个自定义对象初始化程序,类似于double [,]可以使用,但似乎无法弄清楚如何实现它.

理想情况下,我希望看起来像这样

var m1 = new Matrix
        {
            { 1.0, 3.0, 5.0 },
            { 7.0, 1.0, 5.0 }
        };
Run Code Online (Sandbox Code Playgroud)

截至目前,我有一个带有签名的常规构造函数

public Matrix(double[,] inputArray){...}
Run Code Online (Sandbox Code Playgroud)

接受这样的电话

var m1 = new Matrix(new double[,]
        {
            { 1.0, 3.0, 5.0 },
            { 7.0, 1.0, 5.0 }
        });
Run Code Online (Sandbox Code Playgroud)

和一个对象初始化程序,通过继承IEnumerable<double[]>接口和实现公共void Add(double[] doubleVector)方法来接受以下使用

var m2 = new Matrix
        {
            new [] { 1.0, 3.0, 5.0 },                
            new [] { 7.0, 1.0, 5.0 }
        };
Run Code Online (Sandbox Code Playgroud)

当我尝试使用对象初始化器时,我想得到一个没有重载的编译器错误Add,需要X个参数,其中X是我试图创建的列数(即在我提供的示例3中).

如何设置我的课程来接受我提供的论证?

c# object-initializers collection-initializer

5
推荐指数
1
解决办法
100
查看次数

在C#中使用Collection Initializers创建一个新类

我有一个我创建的课程.我想允许该类能够拥有一个集合初始化器.以下是该类的示例:


public class Cat
{
    private Dictionary catNameAndType = new Dictionary();

    public Cat()
    {

    }

    public void Add(string catName, string catType)
    {
        catNameAndType.Add(catName,catType);
    }

}

我希望能够在课堂上做这样的事情:


Cat cat = new Cat()
{
    {"Paul","Black"},
    {"Simon,"Red"}
}

这可能与不是词典和列表的类有关吗?

c# collections collection-initializer

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

对象初始化不适合我

我在这里错过了什么?我希望以下工作正常:

public class ProposalFileInfo
{
    public int FileId { get; set; }
    public bool IsSupportDocument { get; set; }
}

// ...

var attachments = new List<ProposalFileInfo>();

attachments.Add(new ProposalFileInfo { 1, false });
attachments.Add(new ProposalFileInfo { 2, false });
attachments.Add(new ProposalFileInfo { 3, false });
Run Code Online (Sandbox Code Playgroud)

相反,我{在最后三行的每个字符上都出现错误:

无法使用集合初始值设定项初始化类型'xxx.yyy.ProposalFileInfo',因为它没有实现'System.Collections.IEnumerable'

我没有使用Object初始化器吗?为什么它假设一个集合初始化器?(我正在使用Visual Studio 2012.)

c# syntax object-initializers collection-initializer

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

使用集合初始值设定项初始化WebControl对象的Attributes属性

我想初始化WebControl对象,内联,但对于某些字段,这有点棘手.例如,当我尝试初始化对象的Attributes属性时,TextBox如下所示:

using System.Web.UI.WebControls;
Panel panel = new Panel() { Controls = { new TextBox() { Attributes = { { "key", "value" } } } } };
Run Code Online (Sandbox Code Playgroud)

我收到错误:

无法初始化类型" AttributeCollection与集合初始化",因为它没有实现"System.Collections.IEnumerable"

知道在这种情况下内联初始化如何工作?

c# asp.net initialization collection-initializer

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