为了帮助调试我正在处理的一些代码,我开始编写一个方法来递归地打印出对象属性的名称和值.但是,大多数对象都包含嵌套类型,我也想打印它们的名称和值,但仅限于我定义的类型.
这是我到目前为止的概述:
public void PrintProperties(object obj)
{
if (obj == null)
return;
Propertyinfo[] properties = obj.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
if ([property is a type I have defined])
{
PrintProperties([instance of property's type]);
}
else
{
Console.WriteLine("{0}: {1}", property.Name, property.GetValue(obj, null));
}
}
Run Code Online (Sandbox Code Playgroud)
支架之间的部件是我不确定的地方.
任何帮助将不胜感激.
我正在尝试编写一个extension method
以重构我正在编写的linq多对多查询.我正在尝试检索一个集合,Post(s)
该集合已被标记Tag(s)
为作为参数传递给我的方法的集合中的任何集合.
以下是相关实体及其部分属性:
岗位
标量属性:
PostID
,PostDate
导航属性:
PostTags
PostTag
标量属性:
PostTagID
,PostID
,TagID
导航属性:
Post
,Tag
标签
标量属性:
TagID
导航属性:
PostTags
这是我目前使用的查询效果很好:
public IEnumerable<Post> GetPostsByTags(IEnumerable<Tag> tags)
{
return from pt in context.PostTags
from t in tags
where pt.TagID == t.TagID &&
pt.Post.PostDate != null
orderby pt.Post.PostDate descending
select pt.Post;
}
Run Code Online (Sandbox Code Playgroud)
这是extension method
我正在努力创建的(可能不正确的)开始:
public static IEnumerable<TResult> SelectRange<TSource, TResult>(
this IEnumerable<TSource> collection,
Func<IEnumerable<TSource>, …
Run Code Online (Sandbox Code Playgroud) 下面的代码计算的特定属性的平均T
中items
收集:
public double Average<T>(IList<T> items, Func<T, double> selector)
{
double average = 0.0;
for (int i = 0; i < items.Count; i++)
{
average += selector(items[i])
}
return average / items.Count;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以用一个lambda
表达式来调用它:
double average = Average(items, p => p.PropertyName);
Run Code Online (Sandbox Code Playgroud)
我将如何在c ++中执行此操作?这是我到目前为止所拥有的:
template <typename T>
double average(const vector<T>& items, ?)
{
double average= 0.0;
for (int i = 0; i < items.size(); i++)
{
average += ?;
}
return average/ items.size();
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能用c ++调用它 …
我的一些属性viewmodel
:
public ObservableCollection<Task> Tasks { get; set; }
public int Count
{
get { return Tasks.Count; }
}
public int Completed
{
get { return Tasks.Count(t => t.IsComplete); }
}
Run Code Online (Sandbox Code Playgroud)
Tasks
更改时更新这些属性的最佳方法是什么?
我目前的方法:
public TaskViewModel()
{
Tasks = new ObservableCollection<Task>(repository.LoadTasks());
Tasks.CollectionChanged += (s, e) =>
{
OnPropertyChanged("Count");
OnPropertyChanged("Completed");
};
}
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来做到这一点?
在Visual Studio中使用本机c ++时,即使在包含类的范围之外,intellisense也会显示私有成员和函数.这使我很难为我编写的类创建干净的API.
是否有一个原因?这可以预防吗?
在我的WPF MVVM应用程序中,我希望对我的Entity Framework
实体类的更改会自动保留回数据库.我有一些关于实现此功能的想法,但它们似乎都不是最佳选择.
以下是我目前的(非最佳)想法:
使用a DispatcherTimer
保存每个间隔的更改:
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += (sender, args) => Repository.SaveChanges();
timer.Start();
Run Code Online (Sandbox Code Playgroud)保存程序OnExit()
方法的更改.
protected override void OnExit(ExitEventArgs e)
{
Repository.SaveChanges();
base.OnExit(e);
}
Run Code Online (Sandbox Code Playgroud)每次OnPropertyChanged()
调用我的一个保存更改Entities
:
protected virtual void OnPropertyChanged(string propertyName)
{
Repository.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)2和3的组合; 在计算任意数量的属性更改后保存数据,并保存OnExit()
以捕获未达到更改限制的任何更改:
const int limit = 5;
int changes = 0;
protected virtual void OnPropertyChanged(string propertyName)
{
if (++changes == limit)
{
Repository.SaveChanges();
changes = 0;
}
} …
Run Code Online (Sandbox Code Playgroud)我在我的项目中将Visual Basic.Net代码转换为C#.但我对如何将Visual Basic默认属性转换为C#有一些疑问.我的第一个选择是索引器.让我们想象一下Visual Basic中的下一个代码
Public Class MyClass
Dim MyHash as Hashtable
Public sub New()
MyHash = New Hashtable()
MyHash.Add("e1",1)
MyHash.Add("e2",2)
MyHash.Add("e3",3)
End Sub
Defaul Propery MyDefProp(ByVal key as string) as Object
Get
Return MyHash(key)
End Get
Set(ByVal ObjectToStore As Object)
MyHash(key) = ObjectToStore
End Set
End Property
Run Code Online (Sandbox Code Playgroud)
将其转换为C#:
public class MyClass
{
private Hashtable MyHash;
public MyClass()
{
MyHash = new Hashtable();
MyHash.Add("A1",1);
MyHash.Add("A2",2);
MyHash.Add("A3",3);
}
public object this[string key]
{
get
{
return MyHash[key];
}
set
{
MyHash[key] = …
Run Code Online (Sandbox Code Playgroud) 使用jQuery
,我可以使用以下函数在DOM
加载后立即执行代码:
$(function() {
// do stuff here
});
Run Code Online (Sandbox Code Playgroud)
或等效地:
$(document).ready(function() {
// do stuff here
});
Run Code Online (Sandbox Code Playgroud)
为了更好地理解原始javascript,我使用此代码来实现类似的效果:
window.onload = function() {
// do stuff here
}
Run Code Online (Sandbox Code Playgroud)
这种方法是否跨浏览器兼容?有没有更好的方法来实现这个功能?
在我正在研究的类库中,我有一个具有许多属性的类,所以我重构它由一些较小的内部类组成.但是,现在我将这些类标记为内部类,当我将它们作为原始类的公共属性公开时,代码将无法编译.例如:
public class TheOriginalClass
{
public MyInternalClass InternalClassProperty { get; set; }
}
// It doesn't make sense to use this by itself
internal class MyInternalClass
{
public string InterestingProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想在程序集中封装这些辅助类,因为它们在其他地方实例化是没有意义的.
有没有办法实现这个目标?
我最近一直在玩c ++,并想知道为什么会有这么多全局函数.然后我开始考虑用c#编程以及如何存储成员函数,所以我想我的问题是如果我有一个:
public class Foo { public void Bar() { ... } }
然后我做了一些愚蠢的事情就像在列表中添加1,000,000 Foo一样; 这是否意味着我有1,000,000个Foo对象坐在内存中,每个对象都有自己的Bar()函数?或者做一些更聪明的事情?
谢谢.
我正在开发一个类库,其中一个类负责XDocument.Load(url)
从互联网上检索一个Xml文件.看到这个操作可能需要几秒钟才能完成,因此在它自己的线程上运行它是有意义的.
谁有责任创建这个帖子?消费者或检索文件的类?有关于此的最佳做法吗?