C# C语言中的泛型属性#
可能重复:C# C语言中的泛型属性#,c#,generics,properties,C#,Generics,Properties,可能重复: 我不太确定如何做到这一点,但我想做的是创建一种特殊类型的属性,它将在get和set执行特定任务,并将在泛型类型上定义。 例如,在编写此文件时: MyProp<String> name; MyProp名称; 将对字符串值执行预定义的get和set 如何做到这一点 谢谢 您需要创建一个名为MyProp的泛型类。然后,需要添加隐式或显式强制转换运算符,以便可以获取和设置该值,就像它是泛型类型参数中指定的类型一样。这些强制转换运算符可以完成您需要的额外工作。您只需使用泛型类
我不太确定如何做到这一点,但我想做的是创建一种特殊类型的属性,它将在
get
和set
执行特定任务,并将在泛型类型上定义。
例如,在编写此文件时:
MyProp<String> name;
MyProp名称;
将对字符串值执行预定义的get
和set
如何做到这一点
谢谢 您需要创建一个名为MyProp的泛型类。然后,需要添加隐式或显式强制转换运算符,以便可以获取和设置该值,就像它是泛型类型参数中指定的类型一样。这些强制转换运算符可以完成您需要的额外工作。您只需使用泛型类型以常规方式声明属性:
public MyType<string> PropertyName { get; set; }
publicMyType属性名称{get;set;}
如果要调用预定义的方法来执行get或set中的某些操作,请实现属性getter/setter来调用这些方法。您不能以这种方式“更改”属性语法。你能做的是:
class Foo
{
string MyProperty { get; set; } // auto-property with inaccessible backing field
}
通用版本如下所示:
class Foo<T>
{
T MyProperty { get; set; }
}
public class MyProp<T>
{
private T _value;
public T Value
{
get
{
// insert desired logic here
return _value;
}
set
{
// insert desired logic here
_value = value;
}
}
public static implicit operator T(MyProp<T> value)
{
return value.Value;
}
public static implicit operator MyProp<T>(T value)
{
return new MyProp<T> { Value = value };
}
}
class-Foo
{
T MyProperty{get;set;}
}
好的,我咬一口。您需要这样的内容:如果您声明这样的“属性”:
class Foo<T>
{
T MyProperty { get; set; }
}
public class MyProp<T>
{
private T _value;
public T Value
{
get
{
// insert desired logic here
return _value;
}
set
{
// insert desired logic here
_value = value;
}
}
public static implicit operator T(MyProp<T> value)
{
return value.Value;
}
public static implicit operator MyProp<T>(T value)
{
return new MyProp<T> { Value = value };
}
}
更新:我现在非常确定弗雷德里克·莫尔克回答了你的问题并给出了解决方案。我对这个想法不是很满意,但它似乎完全回答了我从你的问题中所理解的问题
public class PropertyFoo {
public MyProp<String> Name;
}
不,不可能,也不是房产,真的。在IDE中查找模板/代码段支持。公共类MyProp
public class MyProp<T>
{
...
}
public class ClassThatUsesMyProp
{
public MyProp<String> SomeProperty { get; set; }
}
{
...
}
使用smyprop的公共类
{
公共MyProp SomeProperty{get;set;}
}
您可以创建这样的泛型类:
class Foo<T>
{
T MyProperty { get; set; }
}
public class MyProp<T>
{
private T _value;
public T Value
{
get
{
// insert desired logic here
return _value;
}
set
{
// insert desired logic here
_value = value;
}
}
public static implicit operator T(MyProp<T> value)
{
return value.Value;
}
public static implicit operator MyProp<T>(T value)
{
return new MyProp<T> { Value = value };
}
}
我不确定我是否理解这个问题。为什么需要泛型?你能举个例子说明你真正想做什么,为什么你想在各种类型上做吗?我也不明白。
MyProp name{get{return DoCustomGet();}{set{DoCustomSet(value);}}}
不起作用吗?它被称为“模板专门化”在C++中,在.NET Gypic中不可用。我认为只有使用Casic运算符,一个也需要赋值操作符,它不能重载。@提姆:CaseTo操作器都是双向的。当将字符串分配给MyPROP时,如果有隐式的CAST运算符,它将被使用。是的,但开发者仍然能够设置PR。使用MyProp值而不被拦截的属性…@Tim:当然,但这不是他想要的使用模型。以预期的、直接的、简单的、正常的方式使用它不会有这个问题。您还可以使用未绑定的泛型类型声明属性,这使事情变得更有趣:public MyType PropertyName{get;set;}。如果实现getter/setter,则值的类型将是T,并且将随使用方式的不同而变化。+1是最符合逻辑的结论。我认为这是缺少的。。要创建一种特殊类型的属性,以便在get和set时执行特定任务..”考虑在内-但由于这个问题确实不清楚,我可能错了。@Benjamin:是的,这个问题有点不清楚,但这就是我的代码示例中插入所需逻辑的地方。注释出现在图片中的地方。您可以加入一些逻辑,无论调用getter或setter时都会执行这些逻辑,而不管是哪个pro珀蒂,这就是我的目的。哇,我完全没有看到整个画面。我真的不是隐式运算符的朋友,但是-我想你回答得很好。+1。是的,这正是我想要的。谢谢!+1写下我所描述的内容。