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