C# 无法为泛型类创建属性 公共类地址 { 公共字符串街号; 公共字符串streetname; 市郊公共场所; 公共字符串邮政编码; 公共国家; } 公营国家 { 公共字符串名称; } 公共阶层人士 其中A:new() { 公开演说; 公众人士() { address.country=新国家(); } }

C# 无法为泛型类创建属性 公共类地址 { 公共字符串街号; 公共字符串streetname; 市郊公共场所; 公共字符串邮政编码; 公共国家; } 公营国家 { 公共字符串名称; } 公共阶层人士 其中A:new() { 公开演说; 公众人士() { address.country=新国家(); } },c#,generics,C#,Generics,编译上述代码时,出现以下错误: 错误CS1061:“A”不包含“country”的定义,并且找不到接受类型为“A”的第一个参数的扩展方法“country”(是否缺少using指令或程序集引用?) 关于如何克服这个问题,你有什么想法吗?首先,你需要理解错误。如果我们写道: public class Address { public string streetno; public string streetname; public string suburb; pub

编译上述代码时,出现以下错误: 错误CS1061:“A”不包含“country”的定义,并且找不到接受类型为“A”的第一个参数的扩展方法“country”(是否缺少using指令或程序集引用?)


关于如何克服这个问题,你有什么想法吗?

首先,你需要理解错误。如果我们写道:

public class Address
{
    public string streetno;
    public string streetname;
    public string suburb;
    public string postcode;
    public Country country;
}
public class Country
{
    public string name;
}

public class Person<A>
    where A : new()
{
    public A address;

    public Person()
    {
        address.country = new Country();
    }
}
现在,您将得到一个
NullReferenceException
——因为您没有创建地址的新实例。。。您的构造函数需要更改为:

public class Person<A> where A : Address, new()

或者,为了获得更大的灵活性,您可能需要创建一个
IAddress
接口,并用它来表示约束,而不是类。。。但这取决于你。如果没有关于您正在做什么的更多细节,就很难推荐具体的操作过程。

除非您已经给出了具有这些属性的泛型类型约束,否则您不能引用这样的泛型类型的特定属性。例如,如果您将类声明为:

public Person()
{
    address = new A();
    address.country = new Country();
}

您必须将您的类型限制为支持country属性的类型。因为直接使用地址类是毫无意义的,考虑使用某种类型的基类/接口。

public class Person
{
    public dynamic address;

    public Person()
    {
        this.address.Country = new Country();
    }
}
公共接口
{
公共字符串streetno{get;set;}
公共字符串streetname{get;set;}
公共字符串{get;set;}
公共字符串邮政编码{get;set;}
公共国家{get;set;}
}
公共阶层人士
A:我的裙子在哪里
{
公开演说;
公众人士()
{
address.country=新国家/地区();
}
}

我可能提交了一个糟糕的例子。这更接近我所拥有的:

public interface IAddress
{
    public string streetno { get; set; }
    public string streetname { get; set; }
    public string suburb { get; set; }
    public string postcode { get; set; }
    public Country country { get; set; }
}

public class Person<A>
    where A : IAddress
{
    public A address;

    public Person()
    {
        address.country = new Country();
    }
}
名称空间
{
公共类标题
{
}
公共类参数
{
}
公共类请求
{
公共报头;
公共参数;
}
}
使用名称空间;
名称空间MyNamespace
{
公社工人
其中A:new()
{
公共请求;
公共空间有意义的工作()
{
req.Header=新的SomeHeader();
req.Parameters=新的SomeParamaters();
}
}
}
请注意类
SomeXXX
继承自对象并实现
System.ComponentModel.INotifyPropertyChanged

我选择泛型的原因是有许多请求、头、参数、响应、数据和错误组。基本上,每种类型的请求都定义了一系列这样的请求

工作类-在编写了3个之后,请求、头、参数、响应、数据和错误都是完全相同的

我不知道dynamic关键字-但它听起来确实像我所追求的,因为我确切地知道需要调用的属性-它们完全相同,类型相同

然而,我的问题是,我使用的是.NET3.5和VS2008


我考虑过接口和约束,但它们似乎无法解决我目前面临的问题。

考虑到代码的意义,我不认为接口在哪里不能满足您的要求。只需将公共属性放在该接口中。
public class Person
{
    public dynamic address;

    public Person()
    {
        this.address.Country = new Country();
    }
}
public interface IAddress
{
    public string streetno { get; set; }
    public string streetname { get; set; }
    public string suburb { get; set; }
    public string postcode { get; set; }
    public Country country { get; set; }
}

public class Person<A>
    where A : IAddress
{
    public A address;

    public Person()
    {
        address.country = new Country();
    }
}
namespace SomeNamespace
{
    public class SomeHeader
    {

    }

    public class SomeParamaters
    {

    }

    public class SomeRequest
    {
        public SomeHeader Header;
        public SomeParamaters Parameters;
    }
}

using SomeNamespace;

namespace MyNamespace
{

    public class Worker<A>
        where A : new()
    {
        public A req;

        public void DoSomeMeaningfulWork()
        {
            req.Header = new SomeHeader();
            req.Parameters = new SomeParamaters();
        }
    }
}