Tag: 属性

C#属性为数组表示法

使用JavaScript可以使用点表示法或数组表示法访问对象。 var myArray = {e1:”elem1″,e2:”elem2″,e3:”elem3″,e4:”elem4″}; var val1 = myArray[“e1”]; var val2 = myArray.e1; 是否可以使用C#实现这一目标? 这就是我的尝试: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int id, FormCollection frmVals) { string value; Owner owner = new Owner(); foreach (var key in frmVals.AllKeys) { value = frmVals[key]; owner[key] = value; } }

抽象类中的属性可见性

有人知道关于在抽象类或父类中公共属性后面定义属性可见性(私有或受保护)的方法的C#最佳实践。 在其他世界中,默认情况下(以及为什么)之间的最佳实践是: public abstract class MyClass { private string myAttribute; public string MyAttribute { get { return myAttribute; } set { myAttribute = value; } } } 和 public abstract class MyClass { protected string myAttribute; public string MyAttribute { get { return myAttribute; } set { myAttribute = value; } } } 我认为子类应该有办法直接处理这个受保护的属性,但如果getter或setter包含更多的代码,它可能不是一个好习惯… 你觉得怎么样? […]

如何在c#中赋值后保留有关对象的信息?

我一直在问我认为可能是什么解决方案的问题 ,但有人指出我陷入了XY问题,我应该问一下我的确切问题。 我有一个结构,我希望其他人能够在他们自己的程序中使用。 它需要可以从其他现有类型隐式转换为此类型,但同时在分配后需要保留一些信息。 这是一个简单的问题示例: using System; public struct MyStruct { public string SomethingImportant; public MyStruct(string s) { SomethingImportant = s; } //this function needs to have no knowledge of how/where the struct is being used public bool SomeFunction(string s) { return s == SomethingImportant; } public static implicit operator MyStruct(double x) { return new […]

你应该引用一个类中的Property或Member Variable吗?

可能重复: 您是否应该通过Property访问同一类中的变量? 我最近碰到了这个,并且好奇是否有某种标准,你应该在课堂上引用哪一个。 我的意思是,你是否应该直接访问成员变量或通过属性(除非你需要躲避一些自定义的setter代码),这应该没有区别,但我想确保没有最佳实践。 partial class MyClass { private string foo; internal string Foo { get { return foo; } private set { foo=value; // I do other stuff } } public void DoSomething() { //Option 1; Foo=”some string”; //Option 2; foo=”some string”; } }

如何通过属性控制方法行为?

我想将自定义属性应用于某些表明它们应作为事务处理的方法。 一般来说,我知道如何通过inheritanceSystem.Attribute来创建自定义属性,但我不知道如何做我需要的。 我的目标是这样的: [TransactionalMethod()] public void SaveData(object someObject) { // … maybe some processing here // … then the object gets saved to a database someObject.Save(); } TransactionalMethod()属性将使该方法的行为就像它被包装在TransactionScope中一样…… try { using(TransactionScope scope = new TransactionScope()) { SaveData(someObject); scope.Complete(); } } catch { // handle the exception here } 如果SaveData()方法抛出一个exception,那么我们就会落在Using和scope.Complete之外。 我不想找到调用SaveData()的每个实例,并手动添加代码使用它周围的语句。 我怎么能创建导致此行为的属性?

unit testing时使用reflection或属性?

这是我有点担心的课程。 我的目标是对地址列表进行unit testing: public class LabelPrinter { private readonly IEnumerable _addresses; public LabelPrinter(IEnumerable addresses) { _addresses = addresses; } public Document Create() { // … Generate PDF, etc … } } 什么是最好的: 使用reflection检查私有财产,或 既然最初的IEnumerable可以从外部修改,那么做一个公共的getter并测试它呢?

为什么合法? 引用类型中的常量,从属性* on *类型,不带前缀类型名称?

看看下面的LINQPad程序: void Main() { } [TestAttribute(Name)] public class Test { public const string Name = “Test”; } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] [Serializable] public class TestAttribute : Attribute { public TestAttribute(string dummy) { } } 这编译没有任何障碍。 为什么? 特别: [TestAttribute(Name)] public class Test { public const string Name = “Test”; 为什么我不写这个: vvvvv [TestAttribute(Test.Name)] public […]

符合CLS的属性和数组参数

我创建了一个在其构造函数中接受(params)数组的属性。 internal class MyTestAttribute : Attribute { public MyTestAttribute (params Options[] options) { …. } } 这里的Option是一个枚举(有很多值),因此一个示例调用站点将是 [MyTest(Option.One, Option.Three)] internal void SomeMethod(int param1, long param2) { …. } 到目前为止,一切都很好,并且设置工作正常,但我在每个呼叫站点上收到“ Arrays as attribute arguments is not CLS-compliant ”警告。 现在,我不得不承认我不需要在C#以外的任何地方使用这个程序集,也不需要警告错误,但数百个警告变得烦人。 显而易见的解决方案是关闭CLS合规性,但目前我无法做到这一点。 有没有其他方法来创建属性仍然会做同样的事情,但摆脱警告?

属性类不调用构造函数

我创建了一个属性,调用MyAttribute,它正在执行某些安全性,并且由于某种原因,构造函数没有被触发,任何原因? public class Driver { // Entry point of the program public static void Main(string[] Args) { Console.WriteLine(SayHello1(“Hello to Me 1”)); Console.WriteLine(SayHello2(“Hello to Me 2”)); Console.ReadLine(); } [MyAttribute(“hello”)] public static string SayHello1(string str) { return str; } [MyAttribute(“Wrong Key, should fail”)] public static string SayHello2(string str) { return str; } } [AttributeUsage(AttributeTargets.Method)] public class MyAttribute […]

如何获取具有指定名称的DataMemberAttribute的属性?

如何reflection性地获取具有给定名称的DataMember的属性(让我们假设每个DataMember都有一个唯一的名称)? 例如,在以下代码中,具有名称“p1”的DataMember的属性是PropertyOne : [DataContract(Name = “MyContract”)] public class MyContract { [DataMember(Name = “p1”)] public string PropertyOne { get; set; } [DataMember(Name = “p2”)] public string PropertyTwo { get; set; } [DataMember(Name = “p3”)] public string PropertyThree { get; set; } } 目前,我有: string dataMemberName = …; var dataMemberProperties = typeof(T).GetProperties().Where(p => p.GetCustomAttributes(typeof(DataMemberAttribute), false).Any()); var propInfo […]