如果我有两个派生自基类的类,我怎样才能编写一个泛型方法,它可以操作两个类的继承属性,所以我不需要编写两个方法......
abstract class BaseClass
{
public int Id { get; set; }
public string slug { get; set; }
}
public class State:BaseClass
{
public string StateName{ get; set; }
public string Description { get; set; }
}
public class City:BaseClass
{
public string TownName { get; set; }
public string someOtherProperty{ get; set; }
}
“通用”方法:
public string Slugify( ?????BaseClass???? record)
{
return record.slug = "...return...something...";
}
调用如:
string a = Slugify(my_State_object); <--- not working
string b = Slugify(my_City_object); <--- not working
谢谢!
编辑: 州和城市是EF-CodeFirst类。最初都有Id和slug - fields。
然后我把它们变成了一个基类,因为我在两个(和其他)表中都有。
我想要一个返回slug的方法,如:
public string Slugify(string p, System.Data.Entity.DbSet<Models.BaseRecords> dbSet){ return ...}
称为
Slugify(text, my_State_object);
以及
Slugify(otherText, my_City_object);
这两个电话都给我一个“......一些无效的参数......”错误。
对不起,这是来自德国VS2010
答案 0 :(得分:6)
你已经给出了答案:
public string Slugify(BaseClass record)
{
return record.slug = "...return...something...";
}
问题是您的BaseClass应该与其子级一样可访问。把它公开,一切都会好的:
public abstract class BaseClass ...
答案 1 :(得分:3)
这是因为您的abstract
基类不是公共的,因此它的子集不易访问。将其更改为:
public abstract class BaseClass
{
public int Id { get; set; }
public string slug { get; set; }
}
剩下的代码很好。
答案 2 :(得分:0)
我假设你生成一个slug的方式因每种类型而异。 State
将基于StateName
属性,而City
将使用TownName
属性。
我认为这可能是一种更好的方法:
public abstract class BaseClass
{
public int Id { get; set; }
public abstract string Slug { get; }
}
public class State:BaseClass
{
public string StateName{ get; set; }
public abstract string Slug
{
get
{
return Regex.Replace(StateName, '[^a-zA-Z0-9]', '-');
}
}
}
答案 3 :(得分:0)
是什么让你不能简单地访问基类的属性?
Class A
{
public string Rawr {get; set;}
}
Class B : A
{
public string Rawr2 { get { return Rawr; } set { Rawr = value; } }
}
var b = new B();
b.Rawr = "asdf"
Console.WriteLine(b.Rawr2);
答案 4 :(得分:0)
试试这个:
BaseClass baseClass = new BaseClass();
baseClass.slug = "initial value";
Console.WriteLine(baseClass.slug); // displays "initial value"
Slugify(baseClass);
Console.WriteLine(baseClass.slug); // displays "...return...something..."
State state = new State();
state.slug = "initial value";
Console.WriteLine(state.slug); // displays "initial value"
Slugify(state);
Console.WriteLine(state.slug); // displays "...return...something..."
你应该看到你的Slugify方法已经可以更改BaseClass和State类中的属性,只要你摆脱问号:
public string Slugify(BaseClass record)
{
return record.slug = "...return...something...";
}