Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的泛型属性#_C#_Generics_Properties - Fatal编程技术网

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写下我所描述的内容。