我正在转换一些现有的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元素会更简单吗?
我有这个简单的代码:
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
C#中的属性可以与集合初始值设定项一起使用吗?
例如,我想做类似以下的事情:
[DictionaryAttribute(){{"Key", "Value"}, {"Key", "Value"}}]
public class Foo { ... }
Run Code Online (Sandbox Code Playgroud)
我知道属性可以有命名参数,因为这看起来与对象初始化器非常相似,我想知道集合初始化器是否也可用.
c# attributes custom-attributes object-initializers collection-initializer
我正在尝试将集合初始化添加到我的班级.我在这里阅读了初始化程序: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#中执行类似以下的操作?
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#代码在某种方法中:
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调用对其他线程的影响.
我有一个自定义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中).
如何设置我的课程来接受我提供的论证?
我有一个我创建的课程.我想允许该类能够拥有一个集合初始化器.以下是该类的示例:
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"}
}
这可能与不是词典和列表的类有关吗?
我在这里错过了什么?我希望以下工作正常:
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.)
我想初始化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"
知道在这种情况下内联初始化如何工作?